我有一个由其他公司编译的静态库。我想知道它是否包含位码(bitcode),哪个命令可以在终端检测到它?
正如其他答案中已经写过的一样,
otool -l yourlib.a | grep __LLVM
走这条路是正确的。
一名苹果工程师说,使用这种方式是正确的。
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
然后你可以分别检查每个架构的位代码,例如:
然后您可以分别检查每个体系结构的位代码,例如:
otool -arch armv7 -l yourlib.a | grep bitcode
otool -arch arm64 -l yourlib.a | grep bitcode
建议对LLVM符号进行测试:
otool -l yourlib.a | grep LLVM
你应该会得到一些带有“__LLVM”的行。
LLVM
进行 grep? - Paul声明:我是LibEBC的作者。
你可以使用ebcutil
来查看Mach-O二进制文件或库中是否存在位码,并且甚至可以使用它来提取嵌入的位码。
如果您想检查静态库中特定文件 (yourFile.o)
是否启用了位码(bitcode),您可以提取 'staticLibrary.a'
并使用相同的 otool
命令。但是,在某些情况下,macOS 不允许使用默认的提取工具提取 staticLibrary.a,大多数第三方工具也无法正常工作。
您可以按照以下步骤检查特定的 .o
文件:
Get the info of the architecture
lipo -info yourStaticLibrary.a
例如输出:armv7 arm64
Extract yourStaticLibrary.a
for any or both of the above architecture
lipo yourStaticLibrary.a -thin armv7 -output yourStaticLibraryarmv7.a
指定你想要提取到的输出路径。
You get the 'yourStaticLibraryarmv7.a'
which then can be easily extracted with the default mac unarchiver
On extracting, you then get a folder 'yourStaticLibraryarmv7'
containing all the .o files
otool -l yourFile.o | grep bitcode
or with the specific architecture
otool -arch armv7 -l yourFile.o | grep bitcode
ar -t yourStaticLibraryarmv7.a
来查看.o文件列表,以及 ar -xv yourStaticLibraryarmv7.a yourFile.o
来提取你的文件。 - yanoar -t ***.a
时我得到了ar:***.a: Inappropriate file type or format
的错误提示。我按照答案中所述的方法删除了armv7切片。 - marchinram如果文件启用了位码,则会显示 'sectname __bitcode'
ENABLE_BITCODE=NO
构建,则无法从启用了ENABLE_BITCODE=YES
的目标中使用它?反之亦然,是否正确? - Yevhen Dubinin-fembed-bitcode-marker
编译而不是-fembed-bitcode
(请检查编译器输出),则这些命令可能会出现误报,因为位码“标记”存在,但实际的位码不存在。此答案提供了更多相关信息。 - William Denniss