Как обернуть c ++ в target-c и связать его с быстрым пакетом?

Надеюсь, кто-нибудь может мне помочь.
Я пытаюсь собрать пакет swift для менеджера пакетов Swift. Я хочу включить в него некоторый источник C ++ и оперировать им со всеми преимуществами ООП. Поэтому я создал новый пакет и добавил три модуля: один для выполнения swift в пакете («swift-exec»), второй для моей библиотеки c ++ («cppLib») и третий для оболочки Objective-C библиотеки lib ++ («cwrapper») ,

Описание пакета:

import PackageDescription

let package = Package(
name: "Objc",
targets: [Target(name: "cwrapper", dependencies:["cpplib"]),
Target(name: "swift-exec", dependencies:["cwrapper"]),
]
)

Мой C ++ Lib:

cpplib.cpp:

#import "include/cpplib.h"
A::A(int _i) : m_Int(_i) {}
int A::getInt() { return m_Int ; }

cpplib.h:

class A {
public:
A(int);
int getInt();
private:
int m_Int;

};

Мой Обертка:

cwrapper.h

#import <Foundation/Foundation.h>

@interface Wrapper : NSObject

-(instancetype)initWithNum:(NSInteger)num;
- (NSInteger)getIntFromObject;

@end

cwrapper.мм

#import "include/cwrapper.h"#import "cpplib.h"
@interface Wrapper()

@property (nonatomic, readonly) A* internal;
@end

@implementation Wrapper

-(instancetype)initWithNum:(NSInteger) num {
self = [super init];
if (self != nil) {
_internal = new A((int)num);

}
return self;
}

- (NSInteger)getIntFromObject {
return (NSInteger)self.internal->getInt();
}

- (void)dealloc {
delete _internal;
}
@end

Мое стремительное выполнение:

main.swift:

import cwrapper

let object = Wrapper.init(num: 54)
guard let object = object  else {
exit(-1)
}
print("\(object.getIntFromObject())")

Когда я строю свой проект в XCode, у меня нет ошибок, мой проект успешно строится, связывается и запускается. Но когда я пытаюсь собрать пакет с помощью команды «быстрая сборка«Я получаю сообщение об ошибке:

$ swift build
Linking cwrapper
Undefined symbols for architecture x86_64:
"_OBJC_CLASS_$_NSObject", referenced from:
_OBJC_CLASS_$_Wrapper in cwrapper.mm.o
"_OBJC_METACLASS_$_NSObject", referenced from:
_OBJC_METACLASS_$_Wrapper in cwrapper.mm.o
"__objc_empty_cache", referenced from:
_OBJC_CLASS_$_Wrapper in cwrapper.mm.o
_OBJC_METACLASS_$_Wrapper in cwrapper.mm.o
"_objc_msgSend", referenced from:
-[Wrapper getIntFromObject] in cwrapper.mm.o
"_objc_msgSendSuper2", referenced from:
-[Wrapper initWithNum:] in cwrapper.mm.o
-[Wrapper dealloc] in cwrapper.mm.o
"_objc_retain", referenced from:
-[Wrapper initWithNum:] in cwrapper.mm.o
"_objc_storeStrong", referenced from:
-[Wrapper initWithNum:] in cwrapper.mm.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
<unknown>:0: error: build had 1 command failures
error: exit(1): /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swift-build-tool -f /path/to/DEV/playground/swpackage/.build/debug.yaml

Итак, мой вопрос: возможно ли сделать то, что я пытаюсь сделать? Обернуть c ++ в objc и связать его с быстрым пакетом?

Если да, что я делаю не так?

ОБНОВИТЬПосле некоторых исследований я обнаружил, что когда Xcode пытается связать файл .mm, он использует команду

/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang++

Но когда я пытаюсь сделать это в консоли, «swift build» использует это:

/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]