如果要用別人包好的套件,有可能會收到以 static library 形式釋出的檔案,其中裡面通常包含:
- libXXX.h
- Debug-iphoneos/libXXX.a
- Debug-iphonesimulator/libXXX.a
- Release-iphoneos/libXXX.a
- Release-iphonesimulator/libXXX.a
如果直接整包加入專案,通常會編譯失敗,並出現錯誤訊息:
ld: warning: ignoring file Debug-iphoneos/libXXX.a, file was built for archive which is not the architecture being linked (i386): Debug-iphoneos/libXXX.a
Undefined symbols for architecture i386:
"_OBJC_CLASS_$_XXX", referenced from:
objc-class-ref in XXXXX.o
ld: symbol(s) not found for architecture i386
clang: error: linker command failed with exit code 1 (use -v to see invocation)
這是由於 iOS 的模擬器實際上還是跑在桌機筆電的 CPU 架構下,而不是手機上的 CPU 架構,因此編譯器找不到正確的 .a 檔來用。
解決方式:
- 將所有檔案加入 Xcode
- 點開專案,選擇目的TARGETS,點開Build Settings分頁,搜尋Library Search Paths,點開左邊的箭頭,預設只會有「Debug」及「Release」
- 點「Debug」右邊的「+」新增細節項目,選擇「Any Architecture」及「Any Simulator」,結果會顯示「Any iOS Simulator SDK」
- 再新增一個細節項目,選擇「Any Architecture」及「Any iOS」,結果顯示「Any iOS SDK」
- 「Release」如法泡製
- 在「TARGET」那欄點滑鼠兩下,開啟列表,放入相對應的「.a」檔案所在的目錄(Debug/Release 及 iphoneos/iphonesimulator)
- 檢查原本 Debug/Release 裡面,相關的東西全部刪除
如果有再根據不同 CPU 架構,需要自行調整。完成後應該就可以順利通過編譯了!
—
參考:http://iphoneincubator.com/blog/xcode/how-to-add-multiple-static-library-files-with-different-architectures-to-xcode