如何使用Bitcode启用xcodebuild静态库?
Xcode 7引入了Bitcode,它是某种LLVM中间二进制代码,这意味着Apple的服务器可以在没有我参与的情况下重新编译我的应用程序以用于不同的体系结构。
在Lookback中,我使用我们的库分发静态归档框架。 看起来,当你用“Build&Archive”构建任何东西时,bitcode实际上并没有发射到我的库中,任何人在他们的应用程序中与我的库链接并尝试使用Bitcode启用生成和存档将获得两个警告:
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构建的) 我有一个构建设备+模拟器通用二进制文件的构建脚本,因此我无法使用构建和存档,但是我从脚本中的命令行运行xcodebuild
。 我怎样才能让xcodebuild
生成一个合适的支持bitcode的库?
Bitcode是一种编译时功能(不是链接时功能),这意味着每个.o文件在使用位代码构建时都应该包含一个称为__bitcode的额外部分。 您可以通过运行otool -l (my .o or .a file) | grep __LLVM
来确认您的二进制代码是否兼容位otool -l (my .o or .a file) | grep __LLVM
otool -l (my .o or .a file) | grep __LLVM
。
当您正常构建时,Xcode会将构建标记-fembed-bitcode-marker
到任何clang调用中。 这似乎是某种'这是bitcode会去,如果bitcode被启用'的事情,并没有真正启用位码。
当你“构建和存档”时,这个标志被替换为-fembed-bitcode
,它确实构建了一个启用Bitcode的二进制。
似乎有两种方法可以使xcodebuild
使用-fembed-bitcode
:
xcodebuild -target LookbackSDK archive
而不是xcodebuild -target LookbackSDK build
。 尽管你可以通过使用-exportArchive -archivePath ./build
(谢谢@JensAyton)来解决这个问题,但它有将二进制文件放入Xcode Organizer而不是build/
文件夹的副作用。 OTHER_CFLAGS="-fembed-bitcode"
强制使用该标志。 你的xcodebuild
调用看起来像xcodebuild OTHER_CFLAGS="-fembed-bitcode" -target LookbackSDK build
。 后者是我选择的,所以我不必更改构建系统,但它会为每个文件生成警告,因为现在-fembed-bitcode-marker
和-fembed-bitcode
发送给clang。 Luckilly后者获胜,生成一个支持Bitcode的库!
资源
一旦添加了对静态库的位代码支持,它将不会与Xcode 6兼容。该应用程序不会被存档。
我想清楚地提到一下bitcode的设置,因为@ nevyn的回答让我有点困惑。
转到构建设置,搜索“自定义编译器标志”。 添加-fembed-bitcode
。 这将建立你的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
当我尝试创建包含我的静态框架的应用程序的存档构建时, 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
上一篇: How do I xcodebuild a static library with Bitcode enabled?