从 Xcode 7 开始,第三方框架应该支持Bitcode成为常见问题之一。我们还可以通过在 Build settings 中将 ENABLE_BITCODE 设置为 NO 来禁用 BITCODE。但我不想关闭它,而是想将我所有的框架转换为兼容 BITCODE。
那么除了在 Xcode 中编译框架之外,如何检查框架是否兼容 BITCODE。有时 Xcode 会给出一个框架的 BITCODE 兼容性错误,即使它们没有 BITCODE 支持,也会留下其他框架。
是否有任何工具/命令行检查?
从 Xcode 7 开始,第三方框架应该支持Bitcode成为常见问题之一。我们还可以通过在 Build settings 中将 ENABLE_BITCODE 设置为 NO 来禁用 BITCODE。但我不想关闭它,而是想将我所有的框架转换为兼容 BITCODE。
那么除了在 Xcode 中编译框架之外,如何检查框架是否兼容 BITCODE。有时 Xcode 会给出一个框架的 BITCODE 兼容性错误,即使它们没有 BITCODE 支持,也会留下其他框架。
是否有任何工具/命令行检查?
从这个 Apple Developers Forum讨论中,用户dshirley和bwilson建议使用命令行工具otool
并grep
检查是否存在位码部分。
$ otool -l libName.o | grep __LLVM
或者
$ otool -l MyFramework.framework/Versions/A/MyFramework | grep __LLVM
运行上述命令,如果库包含位码,您将看到segname __LLVM
输出。
接受的答案表明你应该这样做,grep __LLVM
但我宁愿这样做
otool -l libName.o | grep __bitcode
因为有不同的__LLVM
段,并非所有这些都表明存在比特码。这是一个例子:
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
Section的存在__cmdline
并不表示 Bitcode 存在,但在仅搜索__LLVM
.
我观察到 __bitcode 部分仅适用于静态库,而不适用于动态库。因此,一种解决方案是以下命令。
otool -l libDeviceManager.a | grep __LLVM
此外,有时使用胖二进制文件 otool 可能不会给出 __LLVM 段,即使它们存在。对于这些情况,您可以使用以下命令
otool -arch armv7 -l libDeviceManager.framework/libDeviceManager | grep __LLVM
您可以尝试以下命令:
otool -arch armv7 -l libDeviceManager.a | grep bit code
和
otool -arch arm64 -l libDeviceManager.a | grep bitcode
Targets
在:中设置标志
启用位码
otool -arch arm64 -l myFramework | grep __LLVM
segname __LLVM
segname __LLVM
我(错误地)期望针对本地 iOS 应用程序构建读取相同的输出。事实并非如此。尽管 have ,相同的命令什么也没产生ENABLE_BITCODE YES
。只有当您选择Archive
时,该bitcode
过程才开始。
这个答案帮助了我:
另一种方法
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