【问题标题】:What's the difference between `-fembed-bitcode` and BITCODE_GENERATION_MODE?`-fembed-bitcode` 和 BITCODE_GENERATION_MODE 有什么区别?
【发布时间】:2016-01-23 04:53:09
【问题描述】:

我一直在更新一个静态库来支持位码,从我的研究中我发现了两种方法来实现这一点:

  • 在我的项目构建设置 (link) 中将 fembed-bitcode 标志添加到其他 C 标志选项中
  • 添加用户定义的设置,并将键 BITCODE_GENERATION_MODE 设置为 bitcode (link)

这两个选项有什么区别吗?

我注意到的唯一区别是,通过使用fembed-bitcode,生成的 iphonesimulator 静态库将在启用完整位码的情况下构建(在我的情况下,二进制大小从 5MB 更改为 13MB,我可以使用 @ 检查位码支持987654327@),它的用法似乎没有任何区别。

【问题讨论】:

    标签: objective-c static-libraries bitcode


    【解决方案1】:

    当您使用ENABLE_BITCODE=YES 正常构建库时,Xcode 会将构建标志 -fembed-bitcode-marker 添加到任何 clang 调用中,在最终的 o 文件中放置一个“空”位代码。

    因此,如果您查看构建阶段的编译操作,它将看起来像:

    CompileC {build_path}/StaticBitcode/StaticLogger.o StaticBitcode/StaticLogger.m 正常 armv7 Objective-c com.apple.compilers.llvm.clang.1_0.compiler cd {路径}/StaticBitcode 导出 LANG=en_US.US-ASCII export PATH="/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/usr/bin:/usr/local/bin:/ usr/bin:/bin:/usr/sbin:/sbin" /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang -x objective-c -arch armv7 -fmessage-length=0 -fdiagnostics-show-note-include-stack -fmacro-backtrace -limit=0 -std=gnu99 -fobjc-arc -fmodules -gmodules -fmodules-cache- [...] -fembed-bitcode-marker [...]

    这适用于构建操作(独立于目标)。

    当您Build & Archive 时,-fembed 标志被替换为 -fembed-bitcode,这确实构建了启用 Bitcode 的二进制文件:

    CompileC {build_path}/StaticBitcode/StaticLogger.o StaticBitcode/StaticLogger.m 正常 armv7 Objective-c com.apple.compilers.llvm.clang.1_0.compiler cd {路径}/StaticBitcode 导出 LANG=en_US.US-ASCII export PATH="/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/usr/bin:/usr/local/bin:/ usr/bin:/bin:/usr/sbin:/sbin" /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang -x objective-c -arch armv7 -fmessage-length=0 -fdiagnostics-show-note-include-stack -fmacro-backtrace -limit=0 -std=gnu99 -fobjc-arc -fmodules -gmodules -fmodules-cache- [...] -fembed-bitcode [...]


    fembed-bitcode 标志

    鉴于,如果您将-fembed-bitcode 标志添加到其他 C 标志,您将在编译期间向编译器发送两个标志。它可能会使您在使用链接到另一个项目的库时收到的一些警告静音。但是,您需要检查是否获得了预期的行为。 :)

    (当我在其他 C 标志上使用 -fembed-bitcode 进行测试时,Xcode 给出了警告 clang: warning: argument unused during compilation: '-fembed-bitcode-marker'


    BITCODE_GENERATION_MODE

    另一方面,

    如果您在User-defined Setting 上设置BITCODE_GENERATION_MODE=bitcode,即使在构建阶段,文件也将使用标志-fembed-bitcode 进行编译。

    而且,如果您设置BITCODE_GENERATION_MODE=marker,文件将使用标志-fembed-bitcode-marker 编译,独立于操作阶段。

    因此,如果您想为每个操作(构建和存档)启用位码,更好的方法是使用BITCODE_GENERATION_MODE 设置。


    资源

    【讨论】:

    • 那么,最后,它们真的只是实现相同结果的两种不同方式,强制 Xcode 在不使用存档操作的情况下使用位码支持构建?除了显然fembed-bitcode 会抛出一个警告。
    • 基本上,是的。但是,如果您真的想为所有操作启用位代码,我建议您使用 BITCODE_GENERATION_MODE。重复的标志可能会导致不止一个警告。
    • 对于任何不知道如何添加用户定义设置的人:developer.apple.com/library/ios/recipes/…
    • 编译后可以去掉bitcode吗?例如,在框架具有位码但消费者未使用启用位码的支持进行编译的情况下?在这种情况下,需要在消费者能够成功编译之前删除位码。在框架没有使用位码编译并且消费者启用位码的情况下,他们也无法编译他们的项目。所以基本上问题是如何从二进制文件中剥离位码:)
    • @AvnerBarr “过度信息”很容易!您不需要剥离位代码。如果您构建的框架启用了位码,并且客户端应用程序禁用了位码,则最终产品不会受到框架上额外内容的影响。反过来是不可能的。框架需要在启用了位代码的项目中使用位代码。可以在此项目中看到位代码行为的示例:github.com/igorcferreira/BitcodeLibrary
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-13
    • 2010-10-02
    • 2011-12-12
    • 2010-09-16
    • 2012-03-14
    • 2012-02-06
    相关资源
    最近更新 更多