Ios 如何检查Xcode7是否支持框架位码
从Xcode 7开始,它成为第三方框架应该支持的常见问题之一。我们还可以通过将ENABLE_BITCODE设置为NO-in-Build设置来禁用位代码。但我不想关闭它,而是想将我所有的框架转换为比特码兼容的 因此,除了在Xcode中编译框架外,如何检查框架是否与位代码兼容。有时,Xcode会给出一个框架的位代码兼容性错误,而将其他框架留下,即使它们不支持位代码 是否有任何工具/命令行检查?根据讨论,用户建议使用命令行工具Ios 如何检查Xcode7是否支持框架位码,ios,xcode7,ios-frameworks,bitcode,Ios,Xcode7,Ios Frameworks,Bitcode,从Xcode 7开始,它成为第三方框架应该支持的常见问题之一。我们还可以通过将ENABLE_BITCODE设置为NO-in-Build设置来禁用位代码。但我不想关闭它,而是想将我所有的框架转换为比特码兼容的 因此,除了在Xcode中编译框架外,如何检查框架是否与位代码兼容。有时,Xcode会给出一个框架的位代码兼容性错误,而将其他框架留下,即使它们不支持位代码 是否有任何工具/命令行检查?根据讨论,用户建议使用命令行工具otool和grep检查位代码部分是否存在 $ otool -l libNa
otool
和grep
检查位代码部分是否存在
$ otool -l libName.o | grep __LLVM
或
运行上述命令,如果库中包含位代码,您将看到
segname\uuullvm
输出。接受的答案建议您执行grep\uuullvm
,但我宁愿这样做
otool -l libName.o | grep __bitcode
因为存在不同的\uu LLVM
段,并且并非所有这些段都表示存在位码。下面是一个例子:
Section
sectname __bitcode
segname __LLVM
addr 0x00000000000007d0
size 0x0000000000000f10
offset 3360
align 2^4 (16)
reloff 0
nreloc 0
flags 0x00000000
reserved1 0
reserved2 0
Section
sectname __cmdline
segname __LLVM
addr 0x00000000000016e0
size 0x0000000000000069
offset 7216
align 2^4 (16)
reloff 0
nreloc 0
flags 0x00000000
reserved1 0
reserved2 0
出现
\uuuu cmdline
部分并不表示存在位码,但在搜索\uuuu LLVM
时也会找到位码。您可以尝试以下命令:
otool -arch armv7 -l libDeviceManager.a | grep bit code
及
我已经注意到_位代码部分仅用于静态lib,而不用于动态lib。因此,一个解决方案是下面的命令
otool -l libDeviceManager.a | grep __LLVM
此外,有时使用fat二进制文件时,otool可能不会提供LLVM片段,即使它们存在。对于这些情况,可以使用以下命令
otool -arch armv7 -l libDeviceManager.framework/libDeviceManager | grep __LLVM
在
目标中设置标志:
启用位码
otool -arch arm64 -l myFramework | grep __LLVM
segname __LLVM
segname __LLVM
我(错误地)期望通过本地iOS应用程序构建读取相同的输出。事实并非如此。尽管haveENABLE\u BITCODE YES
,但同一命令没有产生任何结果。只有当您选择了Archive
时,bitcode
过程才会启动
这个答案帮助了我:
还有一种方法
otool -v -s __LLVM __bundle <binary_path>
//e.g.
otool -v -s __LLVM __bundle "/Users/alex/MyModule.framework/MyModule"
谢谢你的回答,迈克尔。所以这个工具可以在.o或.a文件上工作。如何检查.framework文件?.framework只是一种将资源、公共头和库打包在一起的好方法。库就在那里,您需要在上面运行命令。例如,根据目录结构:$otool-l MyFramework.framework/Versions/A/MyFramework | grep u LLVM
,其中MyFramework
是库(不带文件扩展名)。有关框架目录结构的更多信息,请查看MichaelUse this以检查树中的所有.a文件的信息(请注意,最后一个分号必须是命令的一部分。也不要忘记使test_bitcode.sh可执行):查找-名称'*a'-type f-exec./test_bitcode.sh{}\;test_bitcode.sh的内容是:echo“******TESTING$1”;otool-l$1 | grep | ulvm | head-n1这只适用于我检查特定架构时。e、 g.otool-arch arm64-l MyFramework.framework/Versions/A/MyFramework | grep LLVM
这不起作用。我有一个Swift框架,在启用位代码的情况下搜索“u LLVM”是可行的,但事实并非如此。在用户bwilson(苹果员工)的文章中提到搜索u_位代码是不可靠的,并推荐了u LLVM。到今天为止,这种方法对我有效。如果我没有指定任何architecture@superjos是的,您需要为fat二进制文件指定体系结构。
otool -arch arm64 -l myFramework | grep __LLVM
segname __LLVM
segname __LLVM
otool -v -s __LLVM __bundle <binary_path>
//e.g.
otool -v -s __LLVM __bundle "/Users/alex/MyModule.framework/MyModule"
otool -l <binary_path> | grep __bundle