iOS 编译时处理器架构选择
先看看主流的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 编译时处理器架构选择的更多相关文章
- Xamarin.iOS编译时无法连接苹果系统
Xamarin.iOS编译时无法连接苹果系统 错误信息:Unable to connect to Address=’***.***.***.***’ with User=’***’ 即使Vis ...
- iOS 编译时的警告导致无法通过编译
今天编译react native的代码,发现了2个警告,但是系统却当做错误,不能编译成功,查看了一下编译选项,看到了如下配置: 注意到这个-Werror 了吗? 就是这个标志导致系统把所有的 警告都当 ...
- 在Xcode 6 beta里编译Cocos2d-x iOS项目时失败
转载 在Xcode 6 beta里编译Cocos2d-x iOS项目时可能会失败,提示如下错误: Undefined symbols for architecture i386: "_fwr ...
- Java注解处理器--编译时处理的注解
1. 一些基本概念 在开始之前,我们需要声明一件重要的事情是:我们不是在讨论在运行时通过反射机制运行处理的注解,而是在讨论在编译时处理的注解.注解处理器是 javac 自带的一个工具,用来在编译时期扫 ...
- 所生成项目的处理器架构“MSIL”与引用“***”的处理器架构“x86”不匹配。这种不匹配可能会导致运行时失败。请考虑通过配置管理器...
警告:所生成项目的处理器架构“MSIL”与引用“***”的处理器架构“x86”不匹配.这种不匹配可能会导致运行时失败.请考虑通过配置管理器更改您的项目的目标处理器架构,以使您的项目与引用间的处理器架构 ...
- 【DSP开发】德州仪器达芬奇五年之路七宗罪,嵌入式处理器架构之争决战2012
芯片是产业链上游重要的一个环节,一颗小小的芯片具有极高的技术含量和价值,半导体行业每年都会有一个各大厂商营业额的排名,除去2009年,常年盘踞在前三名位置的分别是英特尔,三星半导体和德州仪器,英特尔凭 ...
- iOS 编译过程原理(2)
一.前言 <iOS编译过程的原理和应用>文章介绍了 iOS 编译相关基础知识和简单应用,但也很有多问题都没有解释清楚: Clang 和 LLVM 究竟是什么 源文件到机器码的细节 Link ...
- iOS开发时,在Xcode中添加多个Targets进行版本控制
在iOS开发中,很可能有以下场景:需要开发多个版本,或因需区分收费版,免费版,或因为网络环境需要区分测试版,发布版,或因渠道不同需要区分企业版,AppStore版等等.解决办法无非就是CheckOut ...
- Android 编译时注解解析框架
2.注解 说道注解,竟然还有各种分类,得,这记不住,我们从注解的作用来反推其分类,帮助大家记忆,然后举例强化大家的记忆,话说注解的作用: 1.标记一些信息,这么说可能太抽象,那么我说,你见过@Over ...
随机推荐
- 【BZOJ 4581】【Usaco2016 Open】Field Reduction
http://www.lydsy.com/JudgeOnline/problem.php?id=4581 考虑\(O(n^3)\)暴力. 实际上枚举最靠边的三个点就可以了,最多有12个点. 还是暴力= ...
- pip安装使用详解(转)
pip类似RedHat里面的yum,安装Python包非常方便.本节详细介绍pip的安装.以及使用方法. 1.pip下载安装 1.1 pip下载 1 # wget "https://py ...
- ORacle修改表列长度
alter table 表名 modify column_name varchar2(32) alter table 表名 modify (column_name1 varchar(20) defau ...
- 记一周cdqz训练
#include <cstdio> using namespace std; int main(){ puts("转载请注明出处:http://www.cnblogs.com/w ...
- awk命令速查
awk与sed.grep一样都是为了加工数据流而做成的文本加工过滤器命令.awk会事先把输入的数据根据字段单位进行分割.在没有制定分割单位的情况下,以输入数据中的空格或Tab为分隔符.与sed相比,它 ...
- UVA1586
#include<stdio.h> #include<string.h> #include<ctype.h> int main(){ int n; ]; int n ...
- JS中使用MD5加密
下载 MD5 使用MD5加密的方法:下载md5.js文件,在网页中引用该文件: < script type="text/javascript" src="md5.j ...
- supermap布局设定地图网格及布局网格
地图网格设定 LayoutElements elements = m_mapLayoutControl.MapLayout.Elements; //构造GeoMap GeoMap geoMap = n ...
- 大神php摘录
1. $rs = M('order')->where('id='.$res['id'])->save($order); )){ M('member')->where('id='.$m ...
- jexus5.8.2 linux x64通用版[未集成mono] 配置https
一.找到mono安装位置 sudo find / -name mono 二.首先查看"/lib"或"/usr/lib"等系统库文件夹中是否有SSL库文件的名字, ...