如何检查一个静态库是否包含位码?
如何检查静态库是否包含位码?
检查静态库是否包含位码是一个常见的需求,可以通过以下方法实现:
1. 使用otool命令检查静态库中是否包含LLVM符号:
otool -l yourlib.a | grep LLVM
如果输出结果中包含"__LLVM"字样,则说明静态库包含位码。
2. 如果以上方法没有找到任何结果,但你确定静态库包含位码,那可能是因为你没有以"Archive"方式进行构建。在构建静态库时,确保选择"Build for Archive"选项。
3. 如果对以上方法仍有疑问,你可以参考这个答案,该答案中提供了关于搜索"__LLVM"的更多信息。
希望以上方法对你检查静态库是否包含位码有所帮助!
如其他答案中已经提到的,
otool -l yourlib.a | grep __LLVM
是正确的方法。
一位Apple工程师表示,使用
otool -l yourlib.a | grep bitcode
是不可靠的。
搜索"bitcode"部分并不是一种可靠的检测文件是否包含嵌入式bitcode的方法。如果你想做到这一点,应该搜索"__LLVM"段。你应该知道,使用-fembed-bitcode-marker选项进行的正常构建将生成最小大小的嵌入式bitcode部分,而没有任何实际内容。这样做是为了测试构建过程中与bitcode相关的方面,而不会拖慢构建过程。只有在进行存档构建时,才会包含实际的bitcode内容。
还可以参考xCocoa的评论。
看起来,如果包括了iPhone模拟器架构的代码(x86_64或i386),otool
将不会报告bitcode。
您可以使用以下命令列出库的架构:
lipo -info yourlib.a
然后可以分别检查每个架构的bitcode,例如:
otool -arch armv7 -l yourlib.a | grep bitcode otool -arch arm64 -l yourlib.a | grep bitcode
以下说法是否正确:如果静态库没有使用ENABLE_BITCODE=NO
进行构建,则无法从使用ENABLE_BITCODE=YES
的目标中使用它?反之亦然吗?
Bitcode只是一些额外的信息,因此除了稍微增加一点大小外,它不会造成任何伤害。然而,二进制文件中缺少bitcode意味着无法将其链接到需要bitcode的目标上(即启用了bitcode)。
请注意,如果您使用-fembed-bitcode-marker
而不是-fembed-bitcode
(检查编译器输出),您可能会在这些命令中得到错误的结果,因为bitcode的"标记"是存在的,只是实际的bitcode不存在。有关更多信息,请参考此答案。
根据's的答案,您可以通过在otool结果中使用grep搜索bitcode,然后查看在此之后的第4行的大小字段来检查是否出现错误的结果(可以使用-A 4参数查看grep匹配后的下4行)。如果大小为1,则意味着未设置-fembed-bitcode,并且库不包含bitcode。