首先了解一下 苹果手机不同的机型所支持的arm处理器的指令集
Arm 处理器因为低功耗和小尺寸而闻名,几乎所有的手机设备上都是基于arm的,其在嵌入式系统中的应用非常广泛,它的性能在同等功耗产品中也很出色。
1.armv6 支持 iPhone iPhone2 iPhone3g和第一代 第二代的iPod touch
armv7 支持iPhone4 和 iPhone4s
armv7s 支持 iPhone5 和iPhone5c
arm64 支持iPhone5s。需要最低支持5.1.1
2.机器对于指令集是向下兼容的,也就是说armv7指令集 是可以运行在iPhone5上的,只是效率没那么高而已
3.xcode里面关于arm的选项
@1 Architecture : 指你想支持的指令集。
@2 Valid architectures : 指即将编译的指令集。 (Architecture 和 Valid architectures 的交集,才是xcode编译生成的二进制包所支持的指令集。比如,将Architectures支持arm指令集设置为:armv7,armv7s,对应的Valid Architectures的支持的指令集设置 为:armv7s,arm64,那么此时,XCode生成二进制包所支持的指令集只有armv7s 。)
@3 Build Active Architecture Only : 只是否只编译当前连接设备的指令集。
这个选项起作用需要两个条件:1.值设置为yes 2.成功连接上设备
假定我们将Build Active Architecture Only值设置为YES,同时XCode连接上手机iPhone5S(匹配指令集arm64)
第一种情况
Architectures: armv7, armv7s, arm64
ValidArchitectures: armv6, armv7s, arm64
生成二进制包支持的指令集: arm64
第二种情况
Architectures: armv6, armv7, armv7s
Valid Architectures: armv6, armv7s, arm64
生成二进制包支持的指令集: armv7s
第三种情况
Architectures: armv6, armv7
Valid Architectures: armv6, armv7s, arm64
生成二进制包支持的指令集: armv7
第四种情况
Architectures: armv6
Valid Architectures: armv6, armv7s, arm64
生成二进制包支持的指令集: 虽然编译成功了,但是并没有任何目标生成, 因为从XCode4.5开始,就不再支持armv6指令集,所以列表中写了也是白写。
第五种情况
Architectures: armv7, armv7s, arm64
Valid Architectures: armv7,armv7s
生成二进制包支持的指令集: 编译出错信息
- No architectures to compile for (ONLY_ACTIVE_ARCH=YES, active arch=arm64, VALID_ARCHS=armv7 armv7s)
可以看出:当Build Active Architecture Only起作用时:
连接的手机指令集匹配是由高到低(arm64 > armv7s > armv7)依次匹配的。
如连接手机为iPhone5S,其默认指令集为arm64,若Architectures列表为armv7, armv7s,则会选取armv7s指令集为目标指令集,如果此时Valid Architectures列表中包含该指令集,则成功生成的二进制包只支 持armv7s指令集,若valid Architectures列表不包含此指令集,则编译将会出错:
- No architectures to compile for (ONLY_ACTIVE_ARCH=YES, active arch=armv7s, VALID_ARCHS=armv7 arm64)
同样的,若Architectures列表为armv7,则会选取armv7作为目标指令集,若Valid Architectures列表中包含 了armv7指令集,则能够成功生成二进制包,其支持的指令集只有armv7,若Valid Architectures列表中不包含armv7,则编译 失败。
建议:通常Debug模式设置值为Yes,Release模式设置为No。
4.如果想APP在各个机器上高效率的运行,必须将Build Active Architecture Only 改为no,Valid Architectures 选择对应的指令集 为 armv7 armv7s arm64。这个会为各个指令集 编译对应的代码,但是最后ipa包得体积就翻了3倍,release设置为NO.
5.如果想让app体积保持最小,则现阶段应该选择Valid architectures 为 arm64 ,Build Active Architecture Only选择yes或者no就无所谓了。
6.补充一点 iOS模拟器上不运行arm指令,软件会被编译成x86可以运行的指令,所以只有苹果设备上才会编译运行arm指令集。所以生成静态库时都是会先生成两个.a,一个是i386的用于在模拟器运行,另一个是在真实设备上运行的,然后再用命令行将两个.a合并成一个。
因此如果一些程序中使用的静态库不支持armv7s,而你的工程支持armv7s时,就会出现“xxxx does not contain a(n) armv7s slice:xxxxx for architecture armv7s"的编译错误,想要解决这个问题,有两个方法:
1.如果是开源的,能够找到源代码,则可以用源代码重新打一个支持armv7s的libaray, 或者在工程中直接使用源代码,而不是静态库。
2.如果不是开源的,要么就坐等第三方库的支持,要么就暂时让你的工程不支持armv7s。