如何检查Xcode7是否支持BITCODE框架

时间:2015-09-27 13:53:11

标签: ios xcode7 ios-frameworks bitcode

从Xcode 7开始,它成为第三方框架应该支持Bitcode的常见问题之一。我们还可以通过在Build设置中将ENABLE_BITCODE设置为NO来禁用BITCODE。但我不想把它关掉,而是想把我所有的框架都转换为兼容BITCODE。

那么除了在Xcode中编译框架之外,如何检查框架是否与BITCODE兼容。有时Xcode会为一个框架提供BITCODE兼容性错误,即使他们没有BITCODE支持,也会留下其他框架。

是否有任何工具/命令行检查?

6 个答案:

答案 0 :(得分:39)

来自this Apple Developers Forum讨论,用户dshirleybwilson建议使用命令行工具otoolgrep来检查是否存在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中设置标志:

enter image description here

已启用位码

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 

[Bitcode]