从Xcode 7开始,它成为第三方框架应该支持Bitcode的常见问题之一。我们还可以通过在Build设置中将ENABLE_BITCODE设置为NO来禁用BITCODE。但我不想把它关掉,而是想把我所有的框架都转换为兼容BITCODE。
那么除了在Xcode中编译框架之外,如何检查框架是否与BITCODE兼容。有时Xcode会为一个框架提供BITCODE兼容性错误,即使他们没有BITCODE支持,也会留下其他框架。
是否有任何工具/命令行检查?
答案 0 :(得分:39)
来自this Apple Developers Forum讨论,用户dshirley和bwilson建议使用命令行工具otool
和grep
来检查是否存在bitcode部分。
$ otool -l libName.o | grep __LLVM
或
$ otool -l MyFramework.framework/Versions/A/MyFramework | grep __LLVM
运行上述命令,如果库包含bitcode,您将看到segname __LLVM
输出。
答案 1 :(得分:11)
接受的答案表明你应该grep __LLVM
,但我宁愿这样做
otool -l libName.o | grep __bitcode
由于存在不同的__LLVM
段,并非所有这些都表明存在Bitcode。这是一个例子:
Section
sectname __bitcode
segname __LLVM
addr 0x00000000000007d0
size 0x0000000000000f10
offset 3360
align 2^4 (16)
reloff 0
nreloc 0
flags 0x00000000
reserved1 0
reserved2 0
Section
sectname __cmdline
segname __LLVM
addr 0x00000000000016e0
size 0x0000000000000069
offset 7216
align 2^4 (16)
reloff 0
nreloc 0
flags 0x00000000
reserved1 0
reserved2 0
__cmdline
部分的存在并不表示Bitcode存在,但在搜索__LLVM
时也会找到它。
答案 2 :(得分:4)
我观察到__bitcode节仅对静态库存在,而对动态库不存在。因此,在解决方案上是以下命令。
otool -l libDeviceManager.a | grep __LLVM
此外,有时使用胖二进制文件,即使存在,otool也无法给出__LLVM段。在这种情况下,您可以使用以下命令
otool -arch armv7 libDeviceManager.framework/libDeviceManager | grep __LLVM
答案 3 :(得分:1)
您可以尝试以下命令:
otool -arch armv7 -l libDeviceManager.a | grep bit code
和
otool -arch arm64 -l libDeviceManager.a | grep bitcode
答案 4 :(得分:1)
在Targets
中设置标志:
已启用位码
otool -arch arm64 -l myFramework | grep __LLVM
segname __LLVM
segname __LLVM
我(错误地)希望针对本地iOS应用构建读取相同的输出。事实并非如此。尽管有ENABLE_BITCODE YES
,但同一命令未产生任何结果。仅当您选择Archive
时,bitcode
进程才开始。
这个答案帮助了我
What's the difference between `-fembed-bitcode` and BITCODE_GENERATION_MODE?
答案 5 :(得分:0)
另一种方法
otool -v -s __LLVM __bundle <binary_path>
//e.g.
otool -v -s __LLVM __bundle "/Users/alex/MyModule.framework/MyModule"
或在 __bundle
段中查找 __LLVM
部分
otool -l <binary_path> | grep __bundle