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

iPr*_*abu 26 ios ios-frameworks xcode7 bitcode

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

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

有没有工具/命令行检查?

Mic*_*ers 40

Apple开发者论坛的讨论中,用户dshirleybwilson建议使用命令行工具otoolgrep检查是否存在bitcode部分.

$ otool -l libName.o | grep __LLVM
Run Code Online (Sandbox Code Playgroud)

要么

$ otool -l MyFramework.framework/Versions/A/MyFramework | grep __LLVM
Run Code Online (Sandbox Code Playgroud)

运行上面的命令,如果库包含bitcode,您将看到segname __LLVM输出.

  • .framework只是将资源,公共头文件和库一起打包的好方法.库就在那里,你需要在那里运行命令.例如,取决于目录结构:`$ otool -l MyFramework.framework/Versions/A/MyFramework | grep __LLVM`,其中`MyFramework`是库(没有文件扩展名).有关框架目录结构的更多信息,请查看https://developer.apple.com/library/ios/documentation/MacOSX/Conceptual/BPFrameworks/Concepts/FrameworkAnatomy.html (3认同)
  • 谢谢Michael的回答.因此,此工具适用于.o或.a文件.如何检查.framework文件? (2认同)
  • 这仅在检查特定体系结构时对我有用。例如`otool -arch arm64 -l MyFramework.framework / Versions / A / MyFramework | grep LLVM` (2认同)

Mec*_*cki 13

接受的答案表明你应该做,grep __LLVM但我宁愿这样做

otool -l libName.o | grep __bitcode
Run Code Online (Sandbox Code Playgroud)

因为有不同的__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
Run Code Online (Sandbox Code Playgroud)

__cmdline部分的存在并不表示Bitcode存在,但在搜索时也会找到它__LLVM.

  • 这不起作用.我有一个Swift框架并搜索启用了位代码的"__LLVM",但事实并非如此. (2认同)
  • 在https://forums.developer.apple.com/message/7038中,用户bwilson(Apple员工)提到搜索__bitcode不可靠,建议使用__LLVM (2认同)

小智 6

我观察到__bitcode节仅适用于静态库,而不适用于动态库。因此,在解决方案上是以下命令。

otool -l libDeviceManager.a | grep __LLVM 
Run Code Online (Sandbox Code Playgroud)

同样,有时使用胖二进制文件,即使存在,otool也可能无法给出__LLVM段。在这些情况下,可以使用以下命令

otool -arch armv7 -l libDeviceManager.framework/libDeviceManager | grep __LLVM
Run Code Online (Sandbox Code Playgroud)