先看看主流的ios设备的架构

  • armv6

    • iPhone
    • iPhone2
    • iPhone3G
    • 第一代和第二代iPod Touch
  • armv7
    • iPhone4
    • iPhone4S
  • armv7s
    • iPhone5
    • iPhone5C
  • arm64
    • iPhone5S
    • iPhone6

再看看目前Xcode8的默认设置

根据官方文档,app最后支持的架构是根据 Architectures 和 Valid Architectures 2个选项的交集确定的。为什么使用交际?我觉得是编译过程中这2个参数各有各的作用,但是苹果没有过多地解释。比如说上图这种设置,生成release版后,app支持的架构就是armv7和arm64。注意,没有armv7s,这样做不会影响程序在armv7sd 设备商运行,这是因为armv7s是兼容armv7 的 ,所以在armv7s的手机上,调用armv7的app就可以了,可能效率会稍低一点,但是大小可能会小些。

至于这个Build Active ARchitecture Only,说的是是否仅仅生成一种架构的app,是哪种架构呢?运行在哪个设备上就是哪个架构了。这里需要注意一下,是不是没有看到 x86_64这种运行在模拟器上的架构呢,但是这样的设置却可以正常在模拟器上运行,我觉得,这也是Build Active ARchitecture Only的效果,这个选项的优先级最高,如果设置为YES,会直接忽略上面提到的2个选项!

那么能不能通过手动加入 i386 和 x86_64 来使得生成的程序即能在模拟器执行,又能在真机执行呢?这种情况一般出现在生成 library 或者 framework的时候。我用xcode8 测试的时候,如果加入i386的话会编译报错,具体原因需要研究。目前来说,可行的方法就是利用xcode2次编译,分别生成模拟器的库和真机的库,再用lipo 命令 把2个库的2进制文件合成一个库。

说到了处理器架构,可能会想到bitcode。苹果推出的bitcode,就是一种编程语言和2进制程序之间的中间语言,目的是上传这个中间语言后,苹果可以根据设备需要,动态生成2进制程序,看起来有了这个bitcode,上面的设定是没什么必要了。但是,事实不是这样。

这里推荐一篇关于bitcode的文章:http://www.jianshu.com/p/f42a33f5eb61

这里面说了:

然而bitcode他也不是完全独立于处理器平台和调用约定的.寄存器的大小在指令集中是一个相当重要的特性,众所周知,64bit寄存器可以比32bit寄存器存储更多的数据,生成64bit平台的bitcode和32bit平台的bitcode是明显不同的,还有,调用约定可以根据函数定义或者函数调用来定义,这些可以确定函数的参数传递是传寄存器值呢还是压栈. 一些编程语言还有一些像sizeof(long)这样的预处理指令,这些将在bitcode生成之前前被翻译.一般情况下,对于支持fastcc(fast calling convention)调用的64bit平台会生成与其一致的bitcode代码.

文/戴维营教育(简书作者)
原文链接:http://www.jianshu.com/p/f42a33f5eb61
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。

说明即使使用了bitcode选项,也要生成不同架构的bitcode程序版本,目前的状态是:bitcode只能在一定意义上辅助生成新的2进制程序,不能完全无视不同的cpu架构。

iOS 编译时处理器架构选择的更多相关文章

  1. Xamarin.iOS编译时无法连接苹果系统

    Xamarin.iOS编译时无法连接苹果系统   错误信息:Unable to connect to Address=’***.***.***.***’ with User=’***’   即使Vis ...

  2. iOS 编译时的警告导致无法通过编译

    今天编译react native的代码,发现了2个警告,但是系统却当做错误,不能编译成功,查看了一下编译选项,看到了如下配置: 注意到这个-Werror 了吗? 就是这个标志导致系统把所有的 警告都当 ...

  3. 在Xcode 6 beta里编译Cocos2d-x iOS项目时失败

    转载 在Xcode 6 beta里编译Cocos2d-x iOS项目时可能会失败,提示如下错误: Undefined symbols for architecture i386: "_fwr ...

  4. Java注解处理器--编译时处理的注解

    1. 一些基本概念 在开始之前,我们需要声明一件重要的事情是:我们不是在讨论在运行时通过反射机制运行处理的注解,而是在讨论在编译时处理的注解.注解处理器是 javac 自带的一个工具,用来在编译时期扫 ...

  5. 所生成项目的处理器架构“MSIL”与引用“***”的处理器架构“x86”不匹配。这种不匹配可能会导致运行时失败。请考虑通过配置管理器...

    警告:所生成项目的处理器架构“MSIL”与引用“***”的处理器架构“x86”不匹配.这种不匹配可能会导致运行时失败.请考虑通过配置管理器更改您的项目的目标处理器架构,以使您的项目与引用间的处理器架构 ...

  6. 【DSP开发】德州仪器达芬奇五年之路七宗罪,嵌入式处理器架构之争决战2012

    芯片是产业链上游重要的一个环节,一颗小小的芯片具有极高的技术含量和价值,半导体行业每年都会有一个各大厂商营业额的排名,除去2009年,常年盘踞在前三名位置的分别是英特尔,三星半导体和德州仪器,英特尔凭 ...

  7. iOS 编译过程原理(2)

    一.前言 <iOS编译过程的原理和应用>文章介绍了 iOS 编译相关基础知识和简单应用,但也很有多问题都没有解释清楚: Clang 和 LLVM 究竟是什么 源文件到机器码的细节 Link ...

  8. iOS开发时,在Xcode中添加多个Targets进行版本控制

    在iOS开发中,很可能有以下场景:需要开发多个版本,或因需区分收费版,免费版,或因为网络环境需要区分测试版,发布版,或因渠道不同需要区分企业版,AppStore版等等.解决办法无非就是CheckOut ...

  9. Android 编译时注解解析框架

    2.注解 说道注解,竟然还有各种分类,得,这记不住,我们从注解的作用来反推其分类,帮助大家记忆,然后举例强化大家的记忆,话说注解的作用: 1.标记一些信息,这么说可能太抽象,那么我说,你见过@Over ...

随机推荐

  1. jquery 的一些基本操作

    日常使用中的操作记录,持续更新中: ECharts,一个纯 Javascript 的图表库,可以流畅的运行在 PC 和移动设备上,兼容当前绝大部分浏览器(IE8/9/10/11,Chrome,Fire ...

  2. CocoaPods的那些坑

    CocoaPods的那些坑 文章转自http://blog.csdn.net/zhanniuniu/article/details/52159362#comments 我跟博主的经历超级像!不过自己用 ...

  3. ABP 索引

    官方网站 Github ABP集合贴 @ kebinet https://www.codeproject.com/articles/1115763/using-asp-net-core-entity- ...

  4. sql server 取多个数字或者时间的最大值

    SELECT MAX(b.a) from ( select distinct * from (values (1), (1), (1), (2), (5), (1), (6)) as Y(a) ) a ...

  5. 封装一个函数获取匹配特定的css选择符

    function $$(selector,context){ context=context||document; var elements=context.querySelectorAll(sele ...

  6. c# json总结

    json确实很好用,但是网上写的很多都很复杂,不适合自己,然后每次写了又记不住,又要反复找,所以将其中的代码写下来.以后看这个就可以了 都引用了 Newtonsoft.Json 1.ashx,asmx ...

  7. CodeForces 698C LRU

    吐槽一句:这数据造得真强-. 题意:有一个大小为k的缓存区,每次从n种物品中按照一定的概率选取一种物品尝试放进去.同一个物品每一次选取的概率都是相同的.如果这种物品已经放进去过就不再放进去.如果缓存区 ...

  8. Cookie和Session的区别

    前言 HTTP是一种无状态的协议,为了分辨链接是谁发起的,就需要我们自己去解决这个问题.不然有些情况下即使是同一个网站我们每打开一个页面也都要登录一下.而Session和Cookie就是为解决这个问题 ...

  9. ig WebDataGrid清除选中行

    EnableViewState="false" gridID.Behaviors.Selection.SelectedRows.Clear();

  10. oracle 序列中cache 有什么用途

    create sequence name increment by x //x为增长间隔 start with x //x为初始值 maxvalue x //x为最大值 minvalue x //x为 ...