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

nev*_*vyn 82 xcode ios xcode7 bitcode

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) (如果lib是使用带有正常xcodebuild的Xcode 7构建的)

我有一个构建脚本,构建一个设备+模拟器通用二进制文件,所以我不能使用Build&Archive,而是xcodebuild从我的脚本从命令行运行.如何xcodebuild生成适当的bitcode启用库?

nev*_*vyn 127

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

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

当你"构建和存档"时,这个标志被替换为-fembed-bitcode,它确实构建了一个支持Bitcode的二进制文件.

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

  • 使用'archive'操作,xcodebuild -target LookbackSDK archive而不是xcodebuild -target LookbackSDK build.这有将二进制文件放入Xcode Organizer而不是build/文件夹的副作用,尽管你可以通过使用来解决这个问题-exportArchive -archivePath ./build(感谢@JensAyton)
  • 通过添加其他C标志强制使用该标志OTHER_CFLAGS="-fembed-bitcode".你的xcodebuild调用看起来像xcodebuild OTHER_CFLAGS="-fembed-bitcode" -target LookbackSDK build.

后者是我选择让我没有改变我的编译系统,但它会为每个文件警告,现在既然都-fembed-bitcode-marker-fembed-bitcode被发送到铿锵.Luckilly后者赢了,生成了一个支持Bitcode的库!

资源

  • FWIW,您可以通过添加`-Qunused-arguments`来消除有关`-fembed-bitcode-marker`被忽略的警告. (8认同)

Aar*_*Ash 35

使用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当我尝试创建包含我的静态框架的应用程序的Archive构建时,我一直在遇到一些问题.

我真正想要的是这个:

BITCODE_GENERATION_MODE=bitcode
Run Code Online (Sandbox Code Playgroud)

我实际上在聚合目标中使用了运行脚本,完整的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

  • + 1,`BITCODE_GENERATION_MODE = bitcode`方法似乎是首选,正如[this answer](/sf/answers/2447562491/)中所建议。 (2认同)

Gau*_*ain 17

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

我想清楚地提到bitcode的设置,因为@ nevyn的回答让我有些困惑.

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


Osh*_*iya 7

选择项目 On Build Settings -> Other C flags,将 Debug 设置为 -fembed-bitcode-marker 并将 Release 设置为 -fembed-bitcode

在 Build Settings 上,单击顶部的 + 号添加名为 BITCODE_GENERATION_MODE 的用户定义的构建设置,并将 Debug 设置为标记,Release 设置为 bitcode

Edit schema as Release 然后单击所需的库。一个文件并获取构建路径。获取库表单 Release 文件夹。