2016-12-06 58 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] $^ 

在編譯期間添加鏈接器標記/庫沒有意義。

相關問題