如何在启用Bitcode的情况下xcodebuild一个静态库?

时间:2015-07-17 23:37:34

标签: ios xcode xcode7 bitcode

Xcode 7引入了Bitcode,它是某种LLVM中间二进制文件,这意味着Apple的服务器可以在不参与的情况下为不同的架构重新编译我的应用程序。

在Lookback中,我使用我们的库分发静态存档框架。似乎当你使用除了"构建&存档",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)(如果lib是使用带有正常xcodebuild的Xcode 7构建的)

我有一个构建脚本,可以构建一个设备+模拟器通用二进制文件,所以我不能使用Build&归档,但是,我从我的脚本命令行运行xcodebuild。如何让xcodebuild生成一个正确的bitcode启用库?

4 个答案:

答案 0 :(得分:124)

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

当你正常构建时,Xcode会将构建标志-fembed-bitcode-marker添加到任何clang调用中。这似乎是某种'这是bitcode会去的地方,如果bitcode被启用'事情,并没有实际启用bitcode。

当你" Build&归档",这个标志被-fembed-bitcode取代,xcodebuild确实构建了一个支持Bitcode的二进制文件。

似乎有两种方法可以-fembed-bitcode使用xcodebuild -target LookbackSDK archive

  • 使用'存档'行动,如xcodebuild -target LookbackSDK build而不是build/。这会产生副作用,即将二进制文件放入Xcode管理器而不是-exportArchive -archivePath ./build文件夹,但您可以使用OTHER_CFLAGS="-fembed-bitcode"(感谢@JensAyton)来解决这个问题。
  • 通过添加xcodebuild的其他C标志强制使用该标志。您的xcodebuild OTHER_CFLAGS="-fembed-bitcode" -target LookbackSDK build调用看起来像-fembed-bitcode-marker

后者是我选择的,因此我不必更改构建系统,但它会为每个文件生成警告,因为现在-fembed-bitcodeId: 1 ASIN: 0827229534 title: Patterns of Preaching: A Sermon Sampler group: Book salesrank: 396585 similar: 5 0804215715 156101074X 0687023955 0687074231 082721619X categories: 2 |Books[283155]|Subjects[1000]|Religion & Spirituality[22]|Christianity[12290]|Clergy[12360]|Preaching[12368] |Books[283155]|Subjects[1000]|Religion & Spirituality[22]|Christianity[12290]|Clergy[12360]|Sermons[12370] reviews: total: 2 downloaded: 2 avg rating: 5 2000-7-28 cutomer: A2JW67OY8U6HHK rating: 5 votes: 10 helpful: 9 2003-12-14 cutomer: A2VE83MZF98ITY rating: 5 votes: 6 helpful: 5 Id: 2 ASIN: 0738700797 title: Candlemas: Feast of Flames group: Book salesrank: 168596 similar: 5 0738700827 1567184960 1567182836 0738700525 0738700940 categories: 2 |Books[283155]|Subjects[1000]|Religion & Spirituality[22]|Earth-Based Religions[12472]|Wicca[12484] |Books[283155]|Subjects[1000]|Religion & Spirituality[22]|Earth-Based Religions[12472]|Witchcraft[12486] reviews: total: 12 downloaded: 12 avg rating: 4.5 2001-12-16 cutomer: A11NCO6YTE4BTJ rating: 5 votes: 5 helpful: 4 2002-1-7 cutomer: A9CQ3PLRNIR83 rating: 4 votes: 5 helpful: 5 2002-1-24 cutomer: A13SG9ACZ9O5IM rating: 5 votes: 8 helpful: 8 2002-1-28 cutomer: A1BDAI6VEYMAZA rating: 5 votes: 4 helpful: 4 2002-2-6 cutomer: A2P6KAWXJ16234 rating: 4 votes: 16 helpful: 16 2002-2-14 cutomer: AMACWC3M7PQFR rating: 4 votes: 5 helpful: 5 2002-3-23 cutomer: A3GO7UV9XX14D8 rating: 4 votes: 6 helpful: 6 2002-5-23 cutomer: A1GIL64QK68WKL rating: 5 votes: 8 helpful: 8 2003-2-25 cutomer: AEOBOF2ONQJWV rating: 5 votes: 8 helpful: 5 2003-11-25 cutomer: A3IGHTES8ME05L rating: 5 votes: 5 helpful: 5 2004-2-11 cutomer: A1CP26N8RHYVVO rating: 1 votes: 13 helpful: 9 2005-2-7 cutomer: ANEIANH0WAT9D rating: 5 votes: 1 helpful: 1 都被发送到铛。 Luckilly后者赢了,生成了一个支持Bitcode的库!

资源

答案 1 :(得分:31)

使用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的问题。

我真正想要的是:

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

答案 2 :(得分:17)

为静态库添加bitcode支持后,它将与Xcode 6不兼容。该应用程序将不会存档。

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

转到构建设置,搜索“自定义编译器标志”。添加-fembed-bitcode。这将使用bitcode构建您的lib。

答案 3 :(得分:3)

选择项目 在“构建设置”->“其他C标志”上,将“调试”设置为-fembed-bitcode-marker,将“发布”设置为-fembed-bitcode

在“构建设置”上,单击顶部的+号以添加名称为BITCODE_GENERATION_MODE的用户定义的构建设置,然后将“调试”设置为标记,将“发布”设置为位码

将架构编辑为发布 然后点击library.a文件并获取构建路径 获取库表单Release文件夹