armv6, armv7, armv7s和i386
出现这类问题一般与静态库有关。
i386是代表模拟器,显示i386错误说明静态库不支持模拟器,只支持真机。
armv6,armv7, armv7s是ARM CPU的不同指令集,原则上是向下兼容的。如iPhone4S CPU支持armv7,但它同时兼容armv6,只是使用armv6指令可能无法充分发挥它的特性。同理iPhone5CPU支持armv7s,它虽然也兼容armv7,但是却无法进行相关的优化。
只有在目标设备上,才会执行设备对应的指令集。
如果在工程Build Setting的Architectures 中的“Build ActiveArchitecture Only”选择为YES,则即使你设置成armv7 ,armv7s同时支持,也只会编译对应指令集的包;若选择NO,则编译器会整合两个指令集到一起,此时的包比较大,但是能在iPhone5上使用armv7s的优化,同时也能适配老的设备。一般都是Debug时“Build
Active ArchitectureOnly”选择YES,用当前的架构看代码逻辑是否有问题;而在Release时选择NO,来适配不同的设备。
此外,模拟器并不运行arm代码,软件会被编译成x86可以运行的指令。所以生成静态库时都是会先生成两个.a,一个是i386的用于在模拟器运行,另一个是在真实设备上运行的,然后再用命令将两个.a合并成一个。
因此如果一些程序中使用的静态库不支持armv7s,而你的工程支持armv7s时,就会出现“xxxx does notcontain a(n) armv7s slice:xxxxx for architecturearmv7s"的编译错误,想要解决这个问题,有两个方法:
1.如果是开源的,能够找到源代码,则可以用源代码重新打一个支持armv7s的libaray,或者在工程中直接使用源代码,而不是静态库。
2.如果不是开源的,要么就坐等第三方库的支持,要么就暂时让你的工程不支持armv7s。
本文链接:armv6, armv7,armv7s和i386