【问题标题】:How to check if a framework is Bitcode supported for Xcode7如何检查框架是否支持 Xcode7 的 Bitcode
【发布时间】:2015-09-27 13:53:10
【问题描述】:

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

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

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

【问题讨论】:

    标签: ios xcode7 ios-frameworks bitcode


    【解决方案1】:

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

    $ otool -l libName.o | grep __LLVM
    

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

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

    【讨论】:

    • 感谢迈克尔的回答。所以这个工具适用于 .o 或 .a 文件。如何检查 .framework 文件?
    • .framework 只是将资源、公共头文件和库打包在一起的好方法。该库在那里,您将需要在其上运行命令。因此,例如,取决于目录结构:$ otool -l MyFramework.framework/Versions/A/MyFramework | grep __LLVM,其中MyFramework 是库(没有文件扩展名)。有关框架目录结构的更多信息,请查看developer.apple.com/library/ios/documentation/MacOSX/Conceptual/…
    • 感谢迈克尔提供的信息
    • 这个答案的问题是,如果您使用“-fembed-bitcode-marker”构建,您还会在输出中看到 segname __LLVM,但实际上您没有位码——只有空格图书馆。看到这个答案——stackoverflow.com/questions/34959767/…
    • 这只适用于我在检查特定架构时。例如otool -arch arm64 -l MyFramework.framework/Versions/A/MyFramework | grep LLVM
    【解决方案2】:

    接受的答案建议你应该这样做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
    

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

    【讨论】:

    • 这不起作用。我有一个 Swift 框架,并在启用位代码的情况下搜索“__LLVM”,但这不是。
    • forums.developer.apple.com/message/7038 用户 bwilson(Apple 员工)中提到搜索 __bitcode 不可靠,建议使用 __LLVM
    【解决方案3】:

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

    otool -l libDeviceManager.a | grep __LLVM 
    

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

    otool -arch armv7 -l libDeviceManager.framework/libDeviceManager | grep __LLVM
    

    【讨论】:

    • 截至今天,这种方法对我有用。当我不指定任何架构时它不起作用
    • @superjos 是的,您需要为胖二进制文件指定架构。
    【解决方案4】:

    您可以尝试以下命令:

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

    otool -arch arm64 -l libDeviceManager.a | grep bitcode
    

    【讨论】:

      【解决方案5】:

      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?

      【讨论】:

        【解决方案6】:

        另一种方法

        otool -v -s __LLVM __bundle <binary_path>
        //e.g.
        otool -v -s __LLVM __bundle "/Users/alex/MyModule.framework/MyModule" 
        

        或在__LLVM 段中查找__bundle 部分

        otool -l <binary_path> | grep __bundle 
        

        [Bitcode]

        【讨论】:

          猜你喜欢
          • 2016-05-29
          • 2011-10-17
          • 2014-08-09
          • 1970-01-01
          • 2011-08-12
          • 1970-01-01
          • 2014-01-13
          • 1970-01-01
          • 2014-04-20
          相关资源
          最近更新 更多