在公司負(fù)責(zé)開(kāi)發(fā)內(nèi)部用的 iOS 的靜態(tài)庫(kù)工具调缨。隨著 BitCode 的誕生栋盹,靜態(tài)庫(kù)也需要更新一下夺谁。
先說(shuō)一下 我掉坑的經(jīng)過(guò):
打開(kāi) XCode 托猩,在 Build Phases 里面把編譯選項(xiàng) BitCode 設(shè)置了為 ON碧磅,然后生成 .a碘箍。
接著遵馆,為了驗(yàn)證是否成真的支持 BitCode , 我新建了一個(gè)Project丰榴,導(dǎo)入 .a团搞,然后把新工程的編譯選項(xiàng)也設(shè)置成為ON。 結(jié)果順利編譯多艇。
于是就這么交差了逻恐。
不料出事了....... 公司同事說(shuō)他遇到這樣的錯(cuò)誤:
ld: bitcode bundle could not be generated because '......./libxxx.a(xxxxx.o)' was built without full bitcode. All object files and libraries for bitcode must be generated from Xcode Archive or Install build for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
Google了一番才發(fā)現(xiàn),原來(lái)我的做法還真有問(wèn)題峻黍。
事實(shí)上复隆,按照上面的做法,根本沒(méi)有生成真正的BitCode二進(jìn)制代碼姆涩。
普通的編譯模式下挽拂,XCode使用的編譯選項(xiàng)是 -fembed-bitcode-marker,此時(shí)并不會(huì)編譯出真正的BitCode二進(jìn)制代碼骨饿,而只是做個(gè)標(biāo)記說(shuō):“這里應(yīng)該有BitCode”亏栈;
而在 Archive 編譯模式下,XCode 會(huì)把編譯選項(xiàng)自動(dòng)變?yōu)?-fembed-bitcode宏赘,此時(shí)才會(huì)真的生成BitCode的二進(jìn)制代碼绒北。
可以通過(guò)命令行來(lái)確認(rèn)二進(jìn)制代碼中是否包含BitCode。
otool -l (my .o or .a file) | grep __LLVM
如果有BitCode的話(huà)察署,應(yīng)該會(huì)有很多 segname __LLVM 的結(jié)果闷游。
參考:
http://stackoverflow.com/questions/31486232/how-do-i-xcodebuild-a-static-library-with-bitcode-enabled
http://akataworks.hatenadiary.jp/entry/2015/12/07/202455