在公司负责开发内部用的 iOS 的静态库工具。随着 BitCode 的诞生,静态库也需要更新一下。
先说一下 我掉坑的经过:
打开 XCode ,在 Build Phases 里面把编译选项 BitCode 设置了为 ON,然后生成 .a。
接着,为了验证是否成真的支持 BitCode , 我新建了一个Project,导入 .a,然后把新工程的编译选项也设置成为ON。 结果顺利编译。
于是就这么交差了。
不料出事了....... 公司同事说他遇到这样的错误:
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了一番才发现,原来我的做法还真有问题。
事实上,按照上面的做法,根本没有生成真正的BitCode二进制代码。
普通的编译模式下,XCode使用的编译选项是 -fembed-bitcode-marker,此时并不会编译出真正的BitCode二进制代码,而只是做个标记说:“这里应该有BitCode”;
而在 Archive 编译模式下,XCode 会把编译选项自动变为 -fembed-bitcode,此时才会真的生成BitCode的二进制代码。
可以通过命令行来确认二进制代码中是否包含BitCode。
otool -l (my .o or .a file) | grep __LLVM
如果有BitCode的话,应该会有很多 segname __LLVM 的结果。
参考:
http://stackoverflow.com/questions/31486232/how-do-i-xcodebuild-a-static-library-with-bitcode-enabled
http://akataworks.hatenadiary.jp/entry/2015/12/07/202455