zoukankan      html  css  js  c++  java
  • XCode中Architecturs配置及常见问题

    http://lanvige.github.io/2014/03/19/architecturs-in-xcode/

    XCode 5.1升级后因arm64和CocoaPods的原因,痛了一天,终于解决了问题,同时也记录下这次的学习成果。

    ARMv6/7/7s & ARM64

    在了解Architecture之前,先来认识这几个名字。armv6, armv7, armv7s, arm64是ARM CPU的不同指令集,就像CPU内潜入的软件版本。其在iPhone处理器型号为A4, A8…

    arm 芯片iPhone 机型
    armv6 iPhone, iPhone2, iPhone 3G
    armv7 iPhone 3GS, iPhone 4, iPhone 4S
    armv7s iPhone 5
    arm64 iPhone 5s

    指令是向下兼容的,如iPhone5s CPU支持arm64, 但它同时兼容armv7s,只是如果程序使用armv7s指令进行编译,可能无法充分发挥它的64位特性。

    Architecture是指该程序编译时的目标设备(就是ARM指令集,如armv7,armv7s…),编译期会为不同的指令集(设备)生成专有的安装包。不同设备上会执行该设备对应的指令集,如iPhone5s会优执行arm64(如果有)

    XCode配置

    在Target的Architectures设置项内,可以手工分别添加以上的这几个值,从而新增或删除特性指令集。为了更方便的使用指令组合,XCode中定义了一些变量,然而这些变量在不同的XCode版本下又有着不同的值。

    • $(ARCHS_STANDARD) 
      这个为XCode中Architecture的默认值,XCode5中,该值为armv7, armv7s,在XCode 5.1时,强制加入了对arm64的编译,于是该值为armv7, armv7s, arm64。
    • $(ARCHS_STANDARD_32_BIT) 
      XCode 5和5.1中都为armv7, armv7s,旧一点的版本中应该对应的就只有armv7
    • $(ARCHS_STANDARD_INCLUDING_64_BIT) 
      XCode 5和5.1中都为armv7, armv7s, arm64

    如果程序中设置的Architecture为armv7,当使用iPhone 5真机debug时,就会出现“xxxx does not contain a(n) armv7s slice:xxxxx for architecture armv7s”的编译错误,想要解决这个问题,在Architecture中加上armv7s即可。这种情况更常见于第三方开源库上。

    XCode 5.1后强制加上了对arm64的支持,但很多很三方库没有进行更新,就导致会产生编译错误。这个解决办法就是删掉XCode 5.1中的默认Architecture,然后分别加上armv7armv7s,clean后重新build就可以了。等第三方库都支持arm64后,再把该值改回来即可。

    同时开启arm64支持后,就不能对iOS 5.1.1之前版本进行开发,要强制将deployment target 设置为5.1.1或之后。

    XCode 4.5中移除了对arm6的支持,如果想开发对arm6支持的应用,就要保持用老的XCode了。

    查看.a库支持的指令集

    可以通过该lipo命令查看.a库所支持的指令集。

    1
    2
    3
    4
    5
    6
    
    ~/Library/Developer/Xcode/DerivedData/xxxx/Build/Products/Debug-iphoneos
    
    $ lipo -info *.a
    
    Architectures in the fat file: libPods-AFNetworking.a are: armv7 armv7s
    Architectures in the fat file: libPods.a are: armv7 armv7s
    

    Active Architecture

    Architectures下有一个Bool型的配置项,叫作Build Active Architecture Only

    • YES,表示会针对目标设备进行编译,只会编译对应指令集的包,此时的安装包比较小,但只针对于该指令集设备;
    • NO,编译器会整合两个指令集到一起,生成的安装包比较大,但是能在不同的设备上安装运行。

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

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

    CocoaPods与Architecture

    CocoaPods中所生成Pod项目时,会根据当前Project中的配置来为Pod包的Target Architecture配置。结束后,会有下面的文字提示。

    [!] Found multiple values (‘armv7’, ‘armv7s’) for the architectures (‘ARCHS’) build setting for the ‘Pods’ target definition. Using the first.

    也就是所如果有多个配置的话,它只会统一的给所有的包target设置为第一个(举例,在Origin Projectg下配置的Architecture为armv7 & armv7s 两个项时,pod生成的项目的所有target中都只默认添加armv7一个项)。

    对于XCode 5.1中64位的Error,用$(ARCHS_STANDARD_32_BIT)代替系统默认的$(ARCHS_STANDARD)可以避免这样的问题。

    Automatically Select Architecture

    REF::

  • 相关阅读:
    Java中顺序、并行与并发
    Java设计模式之Iterator
    渗透基础流程思路丶技巧丶与总结
    阿里巴巴Java开发手册之并发处理注意事项
    Java中Thread方法启动线程
    IOCP之客户端及消息传递
    IOCP简单实现
    JAVA 递归线程池测试 ExecutorService / ForkJoinPool
    TCP与UDP的一些心得
    七.badboy检查点和参数化
  • 原文地址:https://www.cnblogs.com/willbin/p/3822554.html
Copyright © 2011-2022 走看看