32

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

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

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

4

6 回答 6

55

这个 Apple Developers Forum讨论中,用户dshirleybwilson建议使用命令行工具otoolgrep检查是否存在位码部分。

$ otool -l libName.o | grep __LLVM

或者

$ otool -l MyFramework.framework/Versions/A/MyFramework | grep __LLVM

运行上述命令,如果库包含位码,您将看到segname __LLVM输出。

于 2015-09-30T15:11:07.947 回答
17

接受的答案表明你应该这样做,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.

于 2015-11-09T18:18:20.537 回答
8

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

otool -l libDeviceManager.a | grep __LLVM 

此外,有时使用胖二进制文件 otool 可能不会给出 __LLVM 段,即使它们存在。对于这些情况,您可以使用以下命令

otool -arch armv7 -l libDeviceManager.framework/libDeviceManager | grep __LLVM
于 2018-08-19T17:57:31.493 回答
1

您可以尝试以下命令:

otool -arch armv7 -l libDeviceManager.a | grep bit code

otool -arch arm64 -l libDeviceManager.a | grep bitcode
于 2016-12-21T08:38:07.660 回答
1

Targets在:中设置标志

在此处输入图像描述

启用位码

otool -arch arm64 -l myFramework | grep __LLVM
  segname __LLVM
   segname __LLVM

我(错误地)期望针对本地 iOS 应用程序构建读取相同的输出。事实并非如此。尽管 have ,相同的命令什么也没产生ENABLE_BITCODE YES。只有当您选择Archive时,该bitcode过程才开始。

这个答案帮助了我:

`-fembed-bitcode` 和 BITCODE_GENERATION_MODE 有什么区别?

于 2020-02-14T14:13:06.947 回答
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 

[比特码]

于 2021-04-04T19:35:13.087 回答