55

我最近下载了 Xcode 7 beta,Xcode 抱怨我的一些 C 库没有被编译成 BitCode。我将如何告诉 Clang 生成与 iOS 兼容的 BitCode?我在 stackoverflow 上看到过类似的答案,但我不知道它们是否适用于为 iOS 生成 BitCode 库。

编辑:

我正在使用正确的设置 -fembed-bitcode,但是当我尝试存档时,我收到错误:ld: warning: ignoring file XXXX/XXXX, file is built for archive which is not the architecture is linked (arm64). 当我使用 -fembed-bitcode-marker 时,我可以存档,但我收到错误:无法生成完整的位码包,因为 XX/XX 仅使用位码标记构建。该库必须从启用位码的 Xcode 归档生成中生成。

关于出了什么问题的任何想法?该库正在成功编译,但它不允许我存档。我创建了一个简单的 add 函数并将其放入库中,我得到了相同的症状,所以它不是我正在编译的库。

编辑 2:您必须使用 bitcode 构建 arm64 和 armv7 版本并将它们一起 lipo。归档时使用位码并不会消除对胖库的需求。来源:链接

4

6 回答 6

74

构建静态库时,您必须添加以下内容以生成位码:

-fembed-bitcode 

对于动态库,您需要另外链接

-fembed-bitcode

注意:此命令仅适用于 Xcode7+

关于使用的公认答案-fembed-bitcode-marker

您应该知道,使用 -fembed-bitcode-marker 选项的正常构建将生成最小大小的嵌入式位码部分,而没有任何实际内容。这样做是为了在不减慢构建过程的情况下测试构建中与位码相关的方面。执行存档构建时会包含实际的位码内容。

bwilson 苹果员工。 https://forums.developer.apple.com/thread/3971#12225


更具体:

  • -fembed-bitcode-marker只是在归档构建后标记位码在二进制文件中的位置。
  • -fembed-bitcode实际上完成了完整的位码生成和嵌入,所以这是构建静态库所需要的。
  • Xcode 本身-fembed-bitcode-marker用于常规构建(例如部署到模拟器)
  • Xcode 仅-fembed-bitcode用于归档构建/生产构建(因为这仅适用于 Apple)。
于 2015-07-10T17:20:44.310 回答
55

转到构建设置。搜索“自定义编译器标志”。
添加-fembed-bitcode其他 C 标志。这将确保在编译时构建的 lib 具有位码兼容性。我为 iOS 64 位和 32 位制作了这个,并将它们合二为一。奇迹般有效。

由于你们有疑问,这里是设置的屏幕截图: 项目目标和 SDK 目标的设置相同。

在此处输入图像描述


位码库不适用于 Xcode 6。

于 2015-09-15T09:52:41.533 回答
30

如果您在添加-fembed-bitcode到其他 C 标志后仍然遇到问题,请在“构建选项”下搜索“启用位码”并将其设置为否。这将允许您正确存档。

于 2016-04-27T03:53:26.987 回答
21

你需要的是-fembed-bitcode。启用 ENABLE_BITCODE 后,Xcode 使用 -fembed-bitcode-marker 进行常规构建,使用 -fembed-bitcode 进行归档构建。一个选项只是简单地“标记”在存档构建后位码在二进制文件中的位置并强制执行新的位码规则,而另一个选项实际上执行完整的位码生成,这可能会更慢,因此并非在每种构建中都启用.

Syo Ikeda 的 BITCODE 处理指南也可能对您有所帮助:

你可以在这里找到完整的幻灯片。

于 2015-11-02T18:51:08.660 回答
12

如果您正在构建静态库并希望启用位码,则仅 (1) ENABLE_BITCODE = YES 可能还不够。

(2) 同样通过设置-fembed-bitcode,当在 Teamcity 中构建时,仍然会为多个文件引发以下错误

bitcode bundle could not be generated because ‘/path/fileInYourStaticLib.a(fileInYourStaticLib.o)’ was built without full bitcode. All object files and libraries for bitcode must be generated from Xcode Archive or Install build for architecture arm64

除了上述步骤(1)和(2)之外,需要考虑的一些提示/事情帮助我最终解决了这个问题

  1. 确保在“项目”和所有“目标”上将变量“其他 C 标志”设置为“-fembed-bitcode”。

  2. 如果您尝试为多个项目创建静态库,请确保所有项目都已"-fembed-bitcode"启用。

  3. On Build Settings, click on the + sign at the top to add a user-defined build setting with the nameBITCODE_GENERATION_MODE, and set Debug to标记, Release to位码

  4. 如果上述步骤不起作用,您也可以尝试此选项。On Build Settings -> Other C flags, set Debug to-fembed 位码标记, and Release to-fembed 位码

这个博客很有帮助 https://medium.com/@heitorburger/static-libraries-frameworks-and-bitcode-6d8f784478a9

此外,每次进行上述更改时,请尝试删除 DerivedData,清理 XCode 项目,并可能退出并重新启动 XCode

于 2017-04-27T08:45:42.300 回答
-1

只是为像我这样的未来菜鸟添加一些细节。

从统一构建到 iOS 时,我遇到了 libVivoxNative.a 的这个问题。我不得不在 4 个不同的地方禁用位码:

截屏

最初我想我只是为目标 Unity-iPhone 设置了它,而不是项目或测试/UnityFramework。更改所有 4 个的设置就可以了。

于 2021-11-05T18:11:35.623 回答