IOS设备之armv6,armv7,armv7s,arm64

arm结构处理器,因为低功耗和小尺寸而闻名,几乎所有的手机都基于arm,其在嵌入式系统中应用非常广泛。 它的性能在同等功耗的产品中也很出色。

        对于IOS而言,模拟器并不运行arm的指令集,编译运行的是x86指令集。只有在IOS设备上,才会执行设备对应的arm指令集。

     armv6, armv7, armv7s arm64实质是arm cpu的不同指令集,原则上是向下兼容的。如iPhone4S cpu支持armv7, 但它同时兼容armv6,只是使用armv6指令可能无法充分发挥它的特性。同理iPhone5 CPU支持armv7s,它虽然也兼容armv7,但是却无法进行相关的优化。

 

armv6设备:iPhone, iPhone2, iPhone 3G,第一代、第二代iPod Touch

armv7设备:iPhone 3GS, iPhone 4, iPhone 4S

                    iPad , iPad 2,  the new iPad

                    iPod Touch 3G, iPod Touch 4

armv7s设备:iPhone 5

arm64:iphone 5s土豪金

 

只有在目标设备上,才会执行设备对应的指令集。

如果在工程Build Setting的Architectures 中的“Build Active Architecture Only”选择为YES,则即使你设置成armv7 , armv7s同时支持,也只会编译对应指令集的包;若选择NO,则编译器会整合两个指令集到一起,此时的包比较大,但是能在iPhone5上使用armv7s的优化,同时也能适配老的设备。一般都是Debug时“Build Active Architecture Only”选择YES,用当前的架构看代码逻辑是否有问题;而在Release时选择NO,来适配不同的设备。

此外,模拟器并不运行arm代码,软件会被编译成x86可以运行的指令。所以生成静态库时都是会先生成两个.a,一个是i386的用于在模拟器运行,另一个是在真实设备上运行的,然后再用命令将两个.a合并成一个。

 

因此如果一些程序中使用的.a静态库不支持armv7s,而你的工程支持armv7s时,就会出现“xxxx does not contain a(n) armv7s slice:xxxxx for architecture armv7s"的编译错误,想要解决这个问题,有两个方法:

1.如果是开源的,能够找到源代码,则可以用源代码重新打一个支持armv7s的libaray, 或者在工程中直接使用源代码,而不是静态库。

2.如果不是开源的,要么就坐等第三方库的支持,要么就暂时让你的工程不支持armv7s

你可能感兴趣的:(IOS设备之armv6,armv7,armv7s,arm64)