2016-12-06 68 views
4

将C++组件添加到正在编译并通过命令行运行的Swift应用程序后,我现在需要编译C++和Objective-C++(* .mm)文件并将它们与Swift应用程序链接起来。通过命令行编译和链接Swift/Objective-C++应用程序

的Makefile:

all: foo-renderer 

clean: 
    rm -f foo-renderer cpp.o objc.o 

cpp.o: FooRenderer/FooRenderer/FooLibrary.cpp 
    clang++ -c -o [email protected] $^ 

objc.o: cpp.o FooRenderer/FooRenderer/FooLibraryWrapper.mm 
    clang++ -c -framework Foundation -o [email protected] $^ 

foo-renderer: objc.o FooRenderer/FooRenderer/*.swift 
    xcrun -sdk macosx swiftc -import-objc-header FooRenderer/FooRenderer/FooRenderer-Bridging-Header.h -o [email protected] $^ 

编译器失败,这些错误:

ld: warning: object file (objc.o) was built for newer OSX version (10.12) than being linked (10.9) 
Undefined symbols for architecture x86_64: 
    "__ZN11FooLibrary23printifyERKNSt3__112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEE", referenced from: 
     -[FooLibraryWrapper printify:] in objc.o 
    "__ZN11FooLibrary8optimizeERKNSt3__112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEE", referenced from: 
     -[FooLibraryWrapper optimize:] in objc.o 
    "__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6__initEPKcm", referenced from: 
     -[FooLibraryWrapper printify:] in objc.o 
     -[FooLibraryWrapper optimize:] in objc.o 
    "__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev", referenced from: 
     -[FooLibraryWrapper printify:] in objc.o 
     -[FooLibraryWrapper optimize:] in objc.o 
    "__ZSt9terminatev", referenced from: 
     ___clang_call_terminate in objc.o 
    "___cxa_begin_catch", referenced from: 
     ___clang_call_terminate in objc.o 
    "___gxx_personality_v0", referenced from: 
     -[FooLibraryWrapper printify:] in objc.o 
     -[FooLibraryWrapper optimize:] in objc.o 
     Dwarf Exception Unwind Info (__eh_frame) in objc.o 
ld: symbol(s) not found for architecture x86_64 

我的第一反应是,没有被列入标准的C++库。我试图添加这些lib标志到以下命令,但无济于事:

cpp.o: FooRenderer/FooRenderer/FooLibrary.cpp 
    clang++ -c --std=c++14 -lstdc++ -lc++ -stdlib=libstdc++ -o [email protected] $^ 

我错过了什么?

+0

您是否尝试过明确指定要使用的SDK,以及最小和最大操作系统版本? Xcode做那些。您可能想要使用Xcode进行构建,并通过将报告导航器中的条目取消折叠来查看它通过的内容(每行显示的条目右侧都有一个不可见的图标)。 – uliwitness

+0

(对于链接器警告,我的意思是) – uliwitness

回答

3

一个问题是cpp.o从最后一个命令行中丢失。将它添加到依赖项列表中应该有效:

foo-renderer: objc.o FooRenderer/FooRenderer/*.swift cpp.o 
     xcrun -sdk macosx swiftc -import-objc-header FooRenderer/FooRenderer/FooRenderer-Bridging-Header.h -o [email protected] $^ 

这是因为链接器需要C++代码中找到的符号的定义。

-l...标志添加到cpp.o目标的命令是不必要的,因为这些是链接器标志,并且此时您只是编译。

此外,您可能不需要objc.o目标的cpp.o依赖关系,因为您仍在编译并且编译不依赖于其他目标文件。如果没有-framework Foundation,你也许可以行,但它不会伤害任何东西。

+0

非常感谢@OmniProg!很好的答案,这真的有帮助。 –

1

我虽然不是很熟悉objc /铛/迅疾,但我对如何进行一些指点你,

> "__ZN11FooLibrary23printifyERKNSt3__112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEE", 
> referenced from: 
>  -[FooLibraryWrapper printify:] in objc.o 

以上说的是,在功能objc对象文件printify,你有一个未定义的符号,可能是FooLibrary :: printify :: basic_string :: char_traits,所以很可能你缺少一个C++库,尝试在链接命令中添加libC++库。

cpp.o: FooRenderer/FooRenderer/FooLibrary.cpp 
    clang++ -c --std=c++14 -lstdc++ -lc++ -stdlib=libstdc++ -o [email protected] $^ 

在编译期间添加链接器标记/库没有意义。

相关问题