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 ...
随机推荐
- IOS比较常用的第三方组件及应用源代码(持续更新中)
把平时看到或项目用到的一些插件进行整理,文章后面分享一些不错的实例,若你有其它的插件欢迎分享,不断的进行更新~ 一:第三方插件 1:基于响应式编程思想的oc 地址:https://github.com ...
- jquery基本操作笔记
来源于:http://www.cnblogs.com/webcome/p/5484005.html jq和js 可以共存,不能混用: 1 2 3 4 5 6 $('.box').css('backgr ...
- AngularJS指令
1. AngularJS指令的特点: AngularJS通过被称为指令的新属性来扩展HTML,指令的前缀为ng-. AngularJS通过内置的指令来为应用添加功能. AngularJS允许你自定义指 ...
- SQL基础语法(四)
SQL ORDER BY 子句 ORDER BY 语句用于对结果集进行排序. ORDER BY 语句 ORDER BY 语句用于根据指定的列对结果集进行排序. ORDER BY 语句默认按照升序对 ...
- Jmeter学习笔记TWO
使用非GUI模式运行Jmeter脚本并自动生成测试报告 命令:jmeter -n -t tougu.jmx -l result.jtl -e -o /tmp/ResultReport 这个命令是用于执 ...
- Gson将字符串转换成JsonObject和JsonArray
以下均利用Gson来处理: 1.将bean转换成Json字符串: public static String beanToJSONString(Object bean) { return new Gso ...
- neo4j-访问提示No authorization header supplied.
在使用java连接neo4j数据库时 public static void main(String[] args) throws SQLException { Connection con = Dri ...
- 用hibernate tools生成对应的sql应用代码
参考资料: eclipse在线配置hibernate tools http://jingyan.baidu.com/article/db55b609959d154ba20a2f5d.html [图]H ...
- Jquery datatables 使用方法
说明: 1.s开头的是字符串 2.b开头的是布尔值 3.i开头的是整型值 4.o开头的是Json对象 5.ao开头的是Json对象数组 6.aa开头的是二维数组 7.fn开头的是函数 服务器端返回的数 ...
- C#基础练习
1.冒泡排序 namespace _0 { class Program { public static int[] BubbleSort(int[] arr) { ; i < arr.Lengt ...