Надеюсь, кто-нибудь может мне помочь.
Я пытаюсь собрать пакет 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
Задача ещё не решена.
Других решений пока нет …