美文网首页
armv6, armv7, armv7s和i386

armv6, armv7, armv7s和i386

作者: 流沙3333 | 来源:发表于2017-03-10 11:29 被阅读11次

    i386是代表模拟器,显示i386错误说明静态库不支持模拟器,只支持真机。

    armv6,armv7, armv7s是ARM CPU的不同指令集,原则上是向下兼容的。如iPhone4S

    CPU支持armv7,但它同时兼容armv6,只是使用armv6指令可能无法充分发挥它的特性。同理iPhone5 CPU支持armv7s,它虽然也兼容armv7,但是却无法进行相关的优化。

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

    如果在工程Build Setting的Architectures中的“Build Active Architecture Only”选择为YES,则即使你设置成armv7 ,armv7s同时支持,也只会编译对应指令集的包;若选择NO,则编译器会整合两个指令集到一起,此时的包比较大,但是能在iPhone5上使用armv7s的优化,同时也能适配老的设备。

    一般都是Debug时“BuildActive Architecture Only”选择YES,用当前的架构看代码逻辑是否有问题;而在Release时选择NO,来适配不同的设备。

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

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

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

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

    相关文章

      网友评论

          本文标题:armv6, armv7, armv7s和i386

          本文链接:https://www.haomeiwen.com/subject/qspngttx.html