iOS之关于Architectures设置及Build Active Architecture Only编译设置

一,前言

   最近在帮朋友解决极光报错的提示:“file was built for archive which is not the architecture being linked (i386)”时,涉及到Build Active Architecture Only设置问题。所以又重新温习了一下,以便查询。

二,关于Architectures 浅谈

    iOS项目打包,或者只是在项目里面调用第三方静态库抑或是自己新建一个静态库,就要无可避免的和Architectures打交道。

 * 什么是Architectures?

   architectures:n. 建筑;架构(architecture的复数)。

 * 关于Xcode中的Architectures 和 Valid Architectures

 Architectures 和 Valid Architectures 在Targets面板的Build Settings下,如下图红框所示:

  

  • Architectures

指定工程支持的指令集的集合,如果设置多个architecture,则生成的二进制数据包会包含多个指令集代码,体积会变大。

  • Valid Architectures

有效的指令集集合,Architectures与Valid Architectures 的交集来确定最终的数据包包含的指令集代码。
Xcode9.1创建的工程,Valid Architectures默认有这几个:armv7 armv7s arm64,说明目前默认最低支持到iPhone5,也就是iOS8(iPhone5才能使用iOS8)

  二者的区别和联系
   大部分人都会被Architectures和Valid Architectures搞混淆。Valid Architectures表示的是你的项目所支持的处理器架构列表,是一个大的集合,而Architectures表示的是你的项目编译的时候最终生成的二进制文件包含的处理器架构集合。当然如果你的Architectures超出了Valid Architectures的范围,只能取Architectures和Valid Architectures的交集。一般来说,不需要修改Valid Architectures,你只要设置Architectures成你需要的架构版本就可以了。如果你理解了这两个概念,再回过头来看看苹果对Architectures和Valid Architectures的默认设置,Valid Architectures设置成:arm64、armv7、armv7s,但是Architectures只设置成:armv7、arm64。这就是说,项目虽然支持市面上大部分手机的处理器架构版本,但是最终只比编译了两个版本。这也可以理解,根据向下兼容原则,目前市面上大部分32位iOS设备都支持armv7,而64位设备都支持arm64, 对样做即保证了高性能手机的运行性能不受影响,同时减小了生成包的大小,一举两得。

  • 关于Armv7,Armv7s,Arm64

    首先请注意上图蓝色框部分,选项里面出现了好几个ARM,ARM指的就是ARM处理器,它被普遍使用在嵌入式设备中,例如手机、平板等。不同的设备对应的处理器架构版本不同,设备只会执行对应处理器版本的指令集。举个栗子,iPhone5的处理器版本是armv7s,如果你最终只编译了arm64版本,项目是不可能跑在iPhone5上面的,再或者你调用了一个只支持arm64的第三方静态库,而你的项目需要支持armv7和armv7s,这个时候你导入这个第三方库编译就会报错。但是有一点需要注意的就是向下兼容原则,即你的项目只编译了armv7s,支持arm64的设备是能够正常运行的,只是这个时候就无法完全发挥手机的性能。

  1.  ARM 

ARM处理器,特点是体积小、低功耗、低成本、高性能, 所以几乎所有手机处理器都基于ARM,在嵌入式系统中应用广泛    

  2. ARM处理器指令集

armv6|armv7|armv7s|arm64都是ARM处理器的指令集,这些指令集都是向下兼容的,例如armv7指令集兼容armv6,只是使用armv6的时候无法发挥出其性能,无法使用armv7的新特性,从而会导致程序执行效率没那么高。
i386|x86_64 是Mac处理器的指令集,i386是针对intel通用微处理器32架构的. x86_64是针对x86架构的64位处理器. 所以当使用iOS模拟器的时候会遇到i386|x86_64, ios模拟器没有arm指令集

  3.目前iOS的ARM处理器指令集及其支持的设备:

arm64:iPhone5S以上| iPad Air| iPad mini2(iPad mini with Retina Display)

armv7s:iPhone5|iPhone5C|iPad4(iPad with Retina Display)

armv7:iPhone3GS|iPhone4|iPhone4S|iPad|iPad2|iPad3(The New iPad)|iPad mini|iPod Touch 3G|iPod Touch4

armv6:iPhone, iPhone2, iPhone3G, 第一代、第二代 iPod Touch(一般不需要去支持)

  4.Mac处理器的指令集:

i386:iPhone4s~5
x86_64:iPhone5s~   

  5.Mac处理器的指令集:

i386是针对intel通用微处理器32位处理器
x86_64是针对x86架构的64位处理器

模拟器32位处理器测试需要i386架构,
模拟器64位处理器测试需要x86_64架构,
真机32位处理器需要armv7,或者armv7s架构,
真机64位处理器需要arm64架构。

  • Build Active Architectures Only配置

    该编译项用于设置是否只编译当前使用的设备对应的arm指令集
    1. 设置成YES时,你连上一个armv7指令集的设备,就算你的Valid Architectures和Architectures都设置成armv7/armv7s/arm64,还是依然只会生成一个armv7指令集的二进制包.(该选项起作用的前提是你的Xcode必须成功连接了调试设备! 如果你没有任何活跃设备,即Xcode没有成功连接调试设备,就算该设置项设置成YES依然还会编译Valid Architectures和Architectures指定的二进制包.)
    2. 通常情况下,该编译选项在Debug模式都设成YES,Release模式都设成NO

    Debug和Release下的设置:
      这个属性主要用在Debug的时候。根据字面意思,就是说只编译你当前连接设备(活跃状态)的处理器版本。这个属性不需要修改,Xcode的默认设置就是Debug为Yes,Release 为No。
      Debug模式设置为Yes,编译的时候只编译成当前连接设备的处理器版本,会大大缩短编译时间。
          Release模式设置为No,你要适配市面上大部分手机,如果Release你还设置成Yes,那么你生成的安装包只能安装在你当前连接设备的编译类型的手机上。当然,这也是你Release编译所花的时间要大大超过Debug的原因。

  • Supported Platform 配置

    指定支持的设备平台
   

  • Base SDK配置

  Base SDK-->指的是当前编译所用的SDK 版本
  Base SDK设置会引导编译器使用该版本的SDK编译和构建应用,也就是说,它会直接控制应用使用哪些API. 默认情况下,Xcode中创建的新工程总是使用最新版本的SDK,而苹果会处理API的废弃,如下图:

  

三,总结

  * standard architectures

    使用 standard architectures (including 64-bit)(armv7,arm64) 参数,则打的包里面有32位、64位两份代码,在iPhone5s( iPhone5s的cpu是64位的 )下,会首选运行64位代码包, 其余的iPhone( 其余iPhone都是32位的,iPhone5c也是32位 ),只能运行32位包,但是包含两种架构的代码包,只有运行在ios6以上的系统上。
    使用 standard architectures (armv7,armv7s) 参数, 则打的包里只有32位代码, iPhone5s的cpu是64位,但是可以兼容32位代码,即可以运行32位代码。但是这会降低iPhone5s的性能。 其余的iPhone对32位代码包更没问题, 而32位代码包,对系统也几乎也没什么限制。
    所以:

    要发挥iPhone5s的64位性能,就要包含64位包,那么系统最低要求为ios6。 如果要兼容ios5以及更低的系统,只能打32位的包,系统都能通用,但是会丧失iPhone5s的性能。当然这样做会使部分设备出现性能损失,当然在普通应用中这点体现几乎感觉不到,至少不会威胁到用户体检。

  * 静态库的制作

   制作静态库.a是指令集选择。如何制作一个“没有问题”的.a静态库,通过以上信息了解到,当我们做App的时候,为了追求高效率,并且减小包的大小,Build Active Architecture Only设置成YES,Architectures按Xcode默认配置就可以,因为arm64向前兼容。但制作.a静态库就不同了,因为要保证兼容性,包括不同iOS设备以及模拟器运行不出错,所以结合当前行业情况,要做到最大的兼容性。

ValidArchitectures设置为:armv7|armv7s|arm64|i386|x86_64
Architectures设置不变(或根据你需要): armv7|arm64

  然后分别选择iOS设备和模拟器进行编译,最后找到相关的.a进行合包,使用lipo -create 真机库.a的路径 模拟器库.a的的路径 -output 合成库的名字.a。

  

  

原文地址:https://www.cnblogs.com/lxlx1798/p/10147065.html

时间: 2024-10-10 22:09:22

iOS之关于Architectures设置及Build Active Architecture Only编译设置的相关文章

IOS随笔-- You can set the "Build Active Architecture Only" and "Archs" values from command line itself. We set ARCHS="armv7 armv7s" ONLY_ACTIVE_ARCH=NO.

今天出现这个问题 No architectures to compile for (ONLY_ACTIVE_ARCH=YES, active arch=arm64, VALID_ARCHS=armv7 armv7s). 解决参考: http://stackoverflow.com/questions/12889065/no-architectures-to-compile-for-only-active-arch-yes-active-arch-x86-64-valid

Xcode 中armv6 armv7 armv7s arm64 i386 x86_64 归纳 (Architectures, Valid Architectures, Build Active Architecture Only)

http://www.jianshu.com/p/09b445300d40 简介: armv7|armv7s|arm64都是ARM处理器的指令集 i386|x86_64 是Mac处理器的指令集 目前iOS的ARM处理器指令集及其支持的设备: armv6 (基本消失了) iPhone iPhone2 iPhone3G iPod Touch1, 2 armv7 (4s最高支持到iOS9, 从iOS10开始支持的也可以不考虑这个了) iPhone 3GS iPhone4 iPhone4S iPad,

Xcode的Architectures、Valid Architectures和Build Active Architecture Only属性(原创)

最近xcode升级了5.1版本,升级之后程序报关于要适配arm64机器的错.之前对xcode的参数配置,一直不是很了解,但实现先面对问题了,就调查了一下并解决它. 一个一个来吧. Architectures 这代表,在这个项目里你想要Xcode编译的目标设备列表.Valid Architectures 还不是太明确这个设置的意图,但是一般来说是不需要更改的,和Architectures一样就可以. 在Xcode5.1里的Valid Architectures 设置里,默认为Standard ar

xcode编译时,有第三方库时,编译设置build active architecture only问题

本文转载至 http://blog.csdn.net/ysysbaobei/article/details/16371263 编译静态库 1.http://blog.csdn.net/dengdengxiximeimei/article/details/8845621 关于Build Active Architecture Only属性 2013-04-24 16:54 153人阅读 评论(0) 收藏 举报 这个属性设置为yes,是为了debug的时候编译速度更快,它只编译当前的architec

小胖说事37-----iOS基础知识之UIScrollview的代理和Build Active Architecture Only属性

总述:今天对UIScrollview的代理记忆有点模糊,所以查了一下文档,并记录下来:还有就是对于Xcode编译打包时候的Build Active Architecture Only属性的理解也记录下来,毕竟,好记性不如烂笔头,O(∩_∩)O哈哈哈~ 1.scrollview的代理: //只要滚动了就会触发 - (void)scrollViewDidScroll:(UIScrollView *)scrollView; { // NSLog(@" scrollViewDidScroll"

关于Build Active Architecture Only属性

Build Active Architecture Only这个属性,设置为NO时,我知道会编译多个版本,不过打出来的包会大不少. 这个属性设置为yes,是为了debug的时候编译速度更快,它只编译当前的architecture版本. 而设置为no时,会编译所有的版本. 这个是设备对应的architecture: armv6:iPhone 2G/3G,iPod 1G/2G armv7:iPhone 3GS/4/4s,iPod 3G/4G,iPad 1G/2G/3G armv7s:iPhone5,

ios开发遇到如下错误:Undefined symbols for architecture arm64,我的解决方案

博客处女作,写得不好望谅解! “for architecture arm64”就是说没有支持arm64,在Build settings里architecture相关的几项需要配置正确 在最近升级cocoapod工具管理中,由于我们的工程版本号已经升级到了2.1了,所以升级过程中遇见了很多问题,折腾了好几天.这个问题便是其中一个.下面说说我们的解决方案 升级过后编译报 ld: can't link with a main executable file '/Users/WayneLiu_Mac/L

iOS不得姐项目--appearance的妙用,再一次设置导航栏返回按钮,导航栏左右按钮的封装(巧用分类)

一.UI_APPEARANCE_SELECTOR 彩票项目中appearance的用法一直没有搞明白,这次通过第二个项目中老师的讲解,更深一层次的了解到了很多关于appearance的作用以及使用方法. 在iOS属性后有UI_APPEARANCE_SELECTOR标志都可以一次性统一设置.这种情况还有很多.比如说统一设置UITabbarItem的文字颜色 通过appearance来同意设置属性最好是在+ (void)initialize;方法里面. 项目中设置导航栏背景图片的代码: 项目中设置T

设置MyEclipse显示代码行数和设置字体的技巧

设置MyEclipse显示代码行数和设置字体的技巧 一个优秀的程序员一定会做到两点,避免bug和瞬间定位bug,显示代码的行数,能帮助我们及时发现错误,分析错误. 1.在MyEclipse菜单栏中找到Window选项,在其下拉菜单中选中Preferences选项,打开 2.在弹出的如下窗口中,在左侧选项列中选General,点击其下拉三角,找到其子选项,Editors 3.在Editors选项中,找到Text Editors选项选中,在右侧中找到Show line numbers,并勾选 4.关