iOS库转换为BitCode

57

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

编辑:

我正在使用正确的设置“-fembed-bitcode”,但是当我尝试进行编译时,出现以下错误: ld: warning: ignoring file XXXX/XXXX,file was built for archive which is not the architecture being linked (arm64)。 当我使用“-fembed-bitcode-marker”时,我可以进行编译,但是我会得到以下错误: full bitcode bundle could not be generated because XX/XX was built only with bitcode marker. The library must be generated from Xcode archive build with bitcode enabled。

你有什么想法吗?库已经成功编译,但它不允许我进行编译。我创建了一个简单的加法函数并将其制作成库,但我得到了相同的症状,所以它不是我正在编译的库的问题。

编辑2: 您必须同时使用bitcode构建arm64和armv7版本并将它们lipo在一起。使用bitcode不能替代在归档时需要fat库。来源:链接


你自己编译这些 C 库吗? - user102008
是的,我特别问的是关于gmp的。但总的来说,我想问的是,我们如何让clang生成适用于iOS的BitCode。我知道有一个选项可以让clang停留在中间表示(IR),但我不知道这是否适用于苹果现在提到的整个BitCode。 - stack_tom
6个回答

77

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

-fembed-bitcode 

对于一个动态库,你还需要链接以下内容

-fembed-bitcode

注意:此命令仅在Xcode7+中可用。

关于使用-fembed-bitcode-marker的已接受答案:

请注意,使用-fembed-bitcode-marker选项进行普通构建将生成最小大小的嵌入式位代码节而不带有任何实际内容。这是一种测试构建中与位代码相关方面而不减慢构建过程的方式。实际的位代码内容包含在你进行存档构建时。

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


更具体地说:

  • -fembed-bitcode-marker只是标记归档构建后二进制文件中位代码的位置。
  • -fembed-bitcode执行完整的位代码生成和嵌入,因此这是您需要用于构建静态库的选项。
  • Xcode本身使用-fembed-bitcode-marker进行常规构建(例如部署到模拟器)。
  • Xcode仅在存档构建/生产构建时使用-fembed-bitcode(因为这仅适用于Apple)。

1
谢谢关于xcode-select构建技巧的分享,这非常有用,我之前不知道。如果我使用-fembed-bitcode,那么产生的库能在模拟器下工作吗?我目前在部署到设备时必须使用-fembed-bitcode-marker库,但在模拟器上运行时必须使用之前编译的fat库,否则会出现链接器错误。此外,如果我使用-fembed-bitcode-marker,Xcode是否会在部署到设备时创建库的位码版本,因为我不再收到警告了? - stack_tom
1
好的,我已经使用那个命令构建了。然而,我遇到了之前相同的症状——那些具有-fat后缀的库可以在模拟器上运行,但是拥有-fembed bitcode后缀的库却不能。此外,我无法打包。XCode显示“ld: warning: ignoring file X, file was built for archive which is not the architecture being linked (arm64)。”当我使用-fembed-bitcode-marker库时,它让我能够打包,然而,正如你所说(因为它实际上并不是位码),我再次收到位码警告。为什么我不能只用-fembed-bitcode就进行归档呢?它甚至说它是为了存档而构建的。 - stack_tom
我也遇到了同样的问题,而且我尝试了相同的方法 :/ - Prateek
请问在哪里插入那行代码?能告诉我吗? - Mahesh Narla

56

转到构建设置。搜索"自定义编译器标志"。
其他 C 标记 中添加 -fembed-bitcode。 这将确保在编译时使用位码兼容性构建 lib。我为 iOS 的64位和32位做了这个,然后将它们合并成一个。 工作得很好。

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

进入图片描述


位码库不适用于 Xcode 6。


2
请问您能否分享制作64位、32位和模拟器的脚本,然后将它们合并成一个吗? - Satyam
lipo -create -output “目标路径” “源1路径” “源2路径” "源3路径"。这里的“源1路径”是指32位模拟器库的路径,“源2路径”是指64位模拟器库的路径,“源3路径”是指“iOS设备库”的路径。这些操作都是在终端中完成的。您可以使用以下命令检查最终库的详细信息:lipo -info “最终库的路径”。 - Gautam Jain
谢谢,我想知道用于创建32位和64位lib文件的构建命令。 - Satyam
1
@GautamJain,我正在使用XCode7.0.1,并在目标构建设置中添加了其他C标志-fembed-bitcode和启用Bitcode=YES,然后在设备和模拟器构建上运行了lipo命令。此外,我正在使用shell脚本以ENABLE_BITCODE=YES和OTHER_CFLAGS="-fembed-bitcode"选项制作设备和模拟器构建。然而,我似乎没有成功生成fat库。Bitcode从fat库中被剥离,当在应用程序目标构建设置下设置Enable Bitcode=YES时,我无法归档我的应用程序。我很困惑为什么lipo会删除bitcode标志? - Deepak Badiger
"位码从通用库中剥离"。我也遇到了这个问题。我正在努力说服自己这是预期行为... - jmoody
显示剩余2条评论

30

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


您先生,您是救命恩人!谢谢! - Tash Pemhiwa
应该将其设置为不是yes,而是no吗? https://dev59.com/D1sW5IYBdhLWcg3wuJKd - satchel

21
您需要的是-fembed-bitcode选项。当启用ENABLE_BITCODE时,Xcode会使用-fembed-bitcode-marker进行常规构建,并使用-fembed-bitcode进行归档构建。 其中一个选项仅“标记”位于二进制文件中的位代码,并强制执行新的位代码规则,而另一个则实际执行全面的位代码生成,这可能会更慢,因此不会在每种类型的构建上启用。
Syo Ikeda的处理BITCODE指南也可能对您有所帮助:

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


12

如果您正在构建一个静态库并希望启用位码(bitcode),仅设置(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. 在“Build Settings”中,点击顶部的“+”号添加一个名为“BITCODE_GENERATION_MODE”的用户定义构建设置,并将“Debug”设置为“marker”,将“Release”设置为“bitcode”。

  4. 如果上述步骤不起作用,您还可以尝试此选项。在 Build Settings -> Other C flags,将 Debug 设置为-fembed-bitcode-marker,将 Release 设置为-fembed-bitcode

此博客非常有帮助 https://medium.com/@heitorburger/static-libraries-frameworks-and-bitcode-6d8f784478a9

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


很酷,但不幸的是它并不像设置标志那么直接 :) - Naishta

0

为了给像我这样的新手添加一些细节。

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

screenshot

最初,我猜我只是将它设置为目标Unity-iPhone,而不是项目或测试/UnityFramework。将所有4个设置更改后问题得到解决。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接