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

What's the difference between `-fembed-bitcode` and BITCODE_GENERATION_MODE?

我一直在更新静态库以支持位码,根据我的研究,我发现了两种实现方法:

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

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

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

因此,如果您查看构建阶段的编译操作,它将类似于:

CompileC {build_path}/StaticBitcode/StaticLogger.o StaticBitcode/StaticLogger.m normal armv7 objective-c com.apple.compilers.llvm.clang.1_0.compiler cd {path}/StaticBitcode export 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 normal armv7 objective-c com.apple.compilers.llvm.clang.1_0.compiler cd {path}/StaticBitcode export 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 设置。


资源