Bitcode導致的編譯報錯

培根芝士發表於2016-06-02

在xcode7.1進行Archive時,會報這樣的錯誤

ld: object contains invalid bitcode: /Users/XXX/UMSocial_Sdk_Extra_Frameworks/Wechat/libWeChatSDK.a(WechatAuthSDK.o) for architecture arm64

clang: error: linker command failed with exit code 1 (use -v to see invocation)


在xcode7.2進行Archive時,會報這樣的錯誤

clang: error: unable to execute command: Segmentation fault: 11

clang: error: linker command failed due to signal (use -v to see invocation)


在Xcode 7中,我們新建一個iOS程式時,bitcode選項預設是設定為YES的。我們可以在”Build Settings”->”Enable Bitcode”選項中看到這個設定。不過,我們現在需要考慮的是三個平臺:iOS,Mac OS,watchOS。

對於iOS,bitcode是可選的;對於watchOS,bitcode是必須的;而Mac OS是不支援bitcode。


所以,如果我們的工程需要支援bitcode,則必要要求所有引入的第三方庫都支援bitcode。


官方文件 App Distribution Guide – App Thinning (iOS, watchOS) 一節中,找到了下面這樣一個定義:

Bitcode is an intermediate representation of a compiled program. Apps you upload to iTunes Connect that contain bitcode will be compiled and linked on the App Store. Including bitcode will allow Apple to re-optimize your app binary in the future without the need to submit a new version of your app to the store.


說的是bitcode是被編譯程式的一種中間形式的程式碼。包含bitcode配置的程式將會在App store上被編譯和連結。bitcode允許蘋果在後期重新優化程式的二進位制檔案,而不需要重新提交一個新的版本到App store上。


而在 What’s New in Xcode-New Features in Xcode 7 中,還有一段如下的描述:


Bitcode. When you archive for submission to the App Store, Xcode will compile your app into an intermediate representation. The App Store will then compile the bitcode down into the 64 or 32 bit executables as necessary.


當提交程式到App store上時,Xcode會將程式編譯為一箇中間表現形式(bitcode)。然後App store會再將這個botcode編譯為可執行的64位或32位程式。


解決方案

Build Settings中,把Enable Bitcode設定為NO

相關文章