`-fembed-bitcode`和BITCODE_GENERATION_MODE之间的区别是什么?

时间:2016-01-23 04:53:09

标签: objective-c static-libraries bitcode

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

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

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

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

1 个答案:

答案 0 :(得分:39)

当您使用ENABLE_BITCODE=YES正常构建库时,Xcode会将构建标志-fembed-bitcode-marker添加到任何clang调用中,并将"空的" bitcode在最后的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 /箱:在/ 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替换,-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 /箱:在/ 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 flag

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

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


BITCODE_GENERATION_MODE

另一方面,

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

并且,如果设置-fembed-bitcode-marker,将使用标志BITCODE_GENERATION_MODE编译文件,与操作阶段无关。

因此,如果您想为每个操作(构建和存档)启用bitcode,更好的方法是使用public class buildingSCO : ScriptableObject { public string Name; public string ID; public resourceSco Res; } 设置。


资源