如何使用Bitcode启用xcodebuild静态库?

Xcode 7引入了Bitcode ,它是某种LLVM中间二进制代码,意味着苹果公司的服务器可以在不需要我参与的情况下重新编译我的应用程序以适应不同的体系结构。

在Lookback中,我使用我们的库分发静态归档框架。 看起来,当你用“Build&Archive”构build任何东西的时候,bitcode实际上并没有发射到我的库中,任何人在我们的应用程序中链接到我的库并尝试使用Bitcode创build和存档将得到两个警告:

  • ld: 'Lookback(Lookback.o)' does not contain bitcode. You must rebuild it with bitcode enabled (Xcode setting ENABLE_BITCODE), obtain an updated library from the vendor, or disable bitcode for this target. (如果lib是用Xcode 6编译的)
  • ld: warning: full bitcode bundle could not be generated because 'Lookback(Lookback.o)' was built only with bitcode marker. The library must be generated from Xcode archive build with bitcode enabled (Xcode setting ENABLE_BITCODE) ld: warning: full bitcode bundle could not be generated because 'Lookback(Lookback.o)' was built only with bitcode marker. The library must be generated from Xcode archive build with bitcode enabled (Xcode setting ENABLE_BITCODE) (如果lib是使用Xcode 7和普通的xcodebuild构build的)

我有一个构build设备+模拟器通用二进制文件的构build脚本,所以我不能使用构build和存档,而是从脚本中的命令行运行xcodebuild 。 我怎样才能让xcodebuild生成一个适当的bitcode-enabled库?

Bitcode是一个编译时function(不是链接时function),这意味着每个.o文件在使用bitcode构build时都应该包含一个称为__bitcode的额外部分。 你可以通过运行otool -l (my .o or .a file) | grep __LLVM来确认你的二进制代码是否兼容 otool -l (my .o or .a file) | grep __LLVM

当您正常构build时,Xcode会将构build标记-fembed-bitcode-marker到任何clang调用中。 这似乎是某种“这是bitcode会去,如果bitcode被启用”的事情,并没有真正启用位码。

当你“build立和存档”,这个标志被replace为-fembed-bitcode ,这确实构build了一个Bitcode启用二进制。

似乎有两种方法使xcodebuild使用-fembed-bitcode

  • 使用“归档”操作,如在xcodebuild -target LookbackSDK archive而不是xcodebuild -target LookbackSDK build 。 尽pipe你可以通过使用-exportArchive -archivePath ./build (谢谢@JensAyton )来解决这个问题,但是在Xcode Organizer而不是build/
  • 通过添加其他C标志与OTHER_CFLAGS="-fembed-bitcode"强制使用标志。 你的xcodebuild调用看起来像xcodebuild OTHER_CFLAGS="-fembed-bitcode" -target LookbackSDK build

后者是我select的,所以我不必改变我的-fembed-bitcode-marker系统,但是它会为每个文件产生警告,因为现在-fembed-bitcode-marker-fembed-bitcode被发送到clang。 后者赢了Luckilly,生成一个支持Bitcode的库!

资源

  • 苹果的DevForums:位码和汇编?
  • SO:iOS库到BitCode

一旦添加了对静态库的位码支持,它将不会与Xcode 6兼容。应用程序将不会被存档。

我想清楚地提到一下bitcode的设置,因为@ nevyn的回答让我困惑了一下。

转到生成设置,search“自定义编译器标志”。 添加-fembed-bitcode 。 这将build立你的lib与位码。

使用Xcode 8,我无法获得OTHER_CFLAGS="-fembed-bitcode"的工作。 我一直沿着was built without full bitcode. All frameworks and dylibs for bitcode must be generated from Xcode Archive or Install build 当我尝试创build包含我的静态框架的应用程序的存档构build时, was built without full bitcode. All frameworks and dylibs for bitcode must be generated from Xcode Archive or Install build

我真正想要的是这样的:

 BITCODE_GENERATION_MODE=bitcode 

实际上,我在一个聚合目标中使用了一个运行脚本,完整的xcodebuild行如下所示(仅供参考):

xcodebuild BITCODE_GENERATION_MODE=bitcode OTHER_CFLAGS="-fembed-bitcode" -target "${PROJECT_NAME}" ONLY_ACTIVE_ARCH=NO -configuration ${CONFIGURATION} -sdk iphoneos BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" clean build