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

hei*_*ent 28 objective-c static-libraries bitcode

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

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

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

我注意到的唯一区别是,通过使用fembed-bitcode,生成的iphonesimulator静态库将在启用完全bitcode的情况下构建(在我的情况下,二进制大小从5MB变为13MB,我可以检查bitcode支持使用otool),这看起来似乎不大使用它有任何不同.

Igo*_*ira 43

当您正常构建库时ENABLE_BITCODE=YES,Xcode会将构建标志添加-fembed-bitcode-marker到任何clang调用中,并在最终的o文件中放置一个"空"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-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标志添加到Other C标志,则在编译期间将向编译器发送两个标志.它可能会使用在另一个项目上链接的库时可以收到的一些警告静音.但是,您需要检查是否获得了预期的行为.:)

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


BITCODE_GENERATION_MODE

另一方面,

如果你设置BITCODE_GENERATION_MODE=bitcodeUser-defined Setting,即使在构建阶段,也会使用标志编译文件-fembed-bitcode.

并且,如果设置BITCODE_GENERATION_MODE=marker,将使用标志编译文件-fembed-bitcode-marker,而不依赖于操作阶段.

因此,如果要为每个操作(构建和存档)启用bitcode,更好的方法是使用该BITCODE_GENERATION_MODE设置.


资源

  • 基本上,是的.但是,如果您真的想要为所有操作启用位代码,我建议您使用BITCODE_GENERATION_MODE.重复的标志可能不仅仅是警告. (3认同)