armv6、armv7、armv7s、arm64 与开发静态库(.a)

armv6、armv7、armv7s、arm64 与开发静态库(.a)声明:本帖系列均为在转载和摘抄的基础上进行补充。若转载请备注原文出处。/** 第一部分 初步认识*/ARM是微处理器行业的一家知名企业,arm处理器以体积小和高性能的优势在嵌入式设备中广泛使用,它的性能在同等功耗产品中也很出色,几乎所有手机都是使用它的。Armv6、armv7、armv7s、arm64都是arm处理器的指令集,所有指令集原则上都是向下兼容

大家好,又见面了,我是你们的朋友全栈君。

声明:本帖为在转载和摘抄的基础上进行补充。若转载请备注原文出处。

/*
*  第一部分  初步认识
*/

ARM是微处理器行业的一家知名企业,arm处理器以体积小和高性能的优势在嵌入式设备中广泛使用,它的性能在同等功耗产品中也很出色,几乎所有手机都是使用它的。

Armv6、armv7、armv7s、arm64都是arm处理器的指令集,所有指令集原则上都是向下兼容的,如iPhone4S的CPU默认指令集为armv7指令集,但它同时也兼容armv6指令集,只是使用armv6指令集时无法充分发挥其性能,即无法使用armv7指令集中的新特性,同理,iPhone5的处理器标配armv7s指令集,同时也支持armv7指令集,只是无法进行相关的性能优化,从而导致程序的执行效率没那么高。

 

需要注意的是iOS模拟器没有运行arm指令集,编译运行的是x86指令集,所以,只有在iOS设备上,才会执行设备对应的arm指令集。(所以,当我们开发静态库的时候,会根据arm指令集以及不同的设备[模拟器、真机]生成不同的静态库,发布出去的时候我们需要将它们整合起来。这个部分会在后文第三部分中讲到)

目前为止Apple移动设备默认指令集(2014.8.22)

————————————————————————————-

armv6 设备: iPhone, iPhone2, iPhone3G, 第一代、第二代 iPod Touch

armv7 设备: iPhone3GS, iPhone4, iPhone4S

                      iPad, iPad2, iPad3(The New iPad), iPad mini

                      iPod Touch 3G, iPod Touch4

armv7s设备: iPhone5, iPhone5C, iPad4(iPad with Retina Display)

arm64 设备: iPhone5S, iPad Air, iPad mini2(iPad mini with Retina Display)

————————————————————————————-

XCode中与指令集相关的选项(Build Settings 面板下 Architectures):

 

Architectures:      

指明选定Target要求被编译生成的二进制包所支持的指令集支持指令集是通过编译生成对应的二进制数据包实现的,如果支持的指令集数目有多个,就会编译出包含多个指令集代码的数据包,从而会造成最终编译生成的包很大。(所以在允许的范围内越少越好)

 

Valid Architectures:

指明可能支持的指令集并非Architectures列表中指明的指令集都会被支持,Valid Architectures限制可能被支持的指令集的范围,即Valid Architectures和Architectures列表的交集,才是XCode最终生成二进制包所支持的指令集。

 

比如,将Architectures支持arm指令集设置为:armv7,armv7s,对应的Valid Architectures的支持的指令集设置为:armv7s,arm64,那么此时,XCode生成二进制包所支持的指令集只有armv7s 。 

 

Build Active Architecture Only:

指明是否只编译当前连接设备所支持的指令集

该选项起作用的条件有两个,必须同时满足才会起作用:

1. 其值设置为YES

2. XCode成功连接调试设备

假定我们将Build Active Architecture Only值设置为YES,同时XCode连接上手机iPhone5S(匹配指令集arm64)

 

1. 第一种情况

Architectures:  armv7, armv7s, arm64

ValidArchitectures:  armv6, armv7s, arm64

生成二进制包支持的指令集: arm64 

 

2. 第二种情况

Architectures: armv6, armv7, armv7s

Valid Architectures:  armv6, armv7s, arm64

生成二进制包支持的指令集: armv7s 

 

3. 第三种情况

Architectures:  armv6, armv7

Valid Architectures: armv6, armv7s, arm64

生成二进制包支持的指令集: armv7

 

4. 第四种情况

Architectures: armv6

Valid Architectures: armv6, armv7s, arm64

生成二进制包支持的指令集: 虽然编译成功了,但是并没有任何目标生成, 因为从XCode4.5开始,就不再支持armv6指令集,所以列表中写了也是白写。

 

5. 第五种情况

Architectures: armv7, armv7s, arm64

Valid Architectures: armv7,armv7s

生成二进制包支持的指令集: 编译出错信息

 
 
 
  1. No architectures to compile for (ONLY_ACTIVE_ARCH=YES, active arch=arm64, VALID_ARCHS=armv7 armv7s) 

可以看出:当Build Active Architecture Only起作用时:

连接的手机指令集匹配是由高到低(arm64 > armv7s > armv7)依次匹配的。

 

如连接手机为iPhone5S,其默认指令集为arm64,若Architectures列表为armv7, armv7s,则会选取armv7s指令集为目标指令集,如果此时Valid Architectures列表中包含该指令集,则成功生成的二进制包只支持armv7s指令集,若alid Architectures列表不包含此指令集,则编译将会出错:

 
 
 
  1. No architectures to compile for (ONLY_ACTIVE_ARCH=YES, active arch=armv7s, VALID_ARCHS=armv7 arm64) 

 

同样的,若Architectures列表为armv7,则会选取armv7作为目标指令集,若Valid Architectures列表中包含了armv7指令集,则能够成功生成二进制包,其支持的指令集只有armv7,若Valid Architectures列表中不包含armv7,则编译失败。

建议:通常Debug模式设置值为Yes,Release模式设置为No

/*
*  第二部分  发展:Xcode6更新默认不支持armv7s架构
*/

目前Xcode 6配置里定义${ARCHS_STANDARD}为armv7, arm64。当前iPhone5的A6和iPad4的A6X两款CPU都是armv7s架构,而之后在iPhone 5S、iPad Air以及iPad Mini Retina采用的A7处理器则是属于64位的arm64架构。这倒不是什么大问题,虽然或多或少存在一些瑕疵,A6一样可以运行基于armv7架构的代码。会让人感到不爽的可能就是某天你的Xcode突然无法构建代码然后告诉你一个关于丢失某架构链接库的错误,其实不过就是因为你升级了你的Xcode而已。

总结一下:苹果又在此迫使我们做出新选择:armv7s这一架构已经随着两代64位产品的出现而遭报销(即armv7s已经不建议使用)。不过作为一个组件开发人员我认为仍然应该包括armv7s然后让开发者去决定支不支持。

/*
* 第三部分  开发静态库组件
*/


一、建立相应的静态库项目:比如你取名为demo,将会获得对应的Demo.h和Demo.m文件。

armv6、armv7、armv7s、arm64 与开发静态库(.a)

二、将.h和.m文件写入可执行代码。

三、编译静态库前的设置:

1.编译静态库分为两种模式:Edit Scheme->Run->Build Configuration->Debug/Release。

Debug、Release调用两个不同的底层库。Debug是调试版本,当选择Debug版的程序才能设置断点、单步执行和NSLog等输出语句。Release版本不包含任何调试信息,所以体积更小、运行速度快。

2.然后就是选择编译对象[真机or模拟器],然后直接Build and Run啦!

3.找到生成的.a文件:Window->Organizer->Demo->Derived Data,可以看到相应的路径,不过右侧还有个小小的向右的箭头,点击一下就能把我们快速打开相应路径文件夹

4.生成的.a文件就在以下三个文件夹下,其实还有个debug模式的模拟器类型的,根据自己需要来生成吧。每一个文件夹下都有三个文件/文件夹:分别是libDemo.a、include(文件夹下含有Demo.h)、DemoTest.xctest 。我们将相应的.h和.a文件导入需要的工程就能使用了。

armv6、armv7、armv7s、arm64 与开发静态库(.a)

5.切记如果调试的时候使用了不对等版本的静态库,是会报错的哦!

所以这里我们写一点关于将多个静态库合并为一个静态库(就是第一部分里面说的待会再说的问题哈):
方法很简单,打开终端,执行合并真机和模拟器的库的命令是 lipo -create xxxx_iphoneos.a xxxx_simulator.a -output xxxx.a

静态库大小:通用版本 >= 模拟版本+真机版


另外查看支持构架的命令是lipo -info 路径/Demo.a
模拟器.a 输出是 i386 x86_64 
真机.a 输出是armv7 arm64
通用版.a输出是armv7 i386 x86_64 arm64

生成的通用版.a的路径就在执行命令对应的文件夹的位置


当然啦,你想查看支持架构的时候可能报错,比如:
xcrun: error: active developer path (“/Applications/Xcode.app/Contents/Developer”) does not exist, use xcode-select to change
对应的解决方法,终端执行:sudo xcode-select -switch /Applications/Xcode.app/Contents/Developer 即可解决

相关原帖链接:

http://blog.csdn.net/hxl188/article/details/39291159 第一部分

http://www.cocoachina.com/ios/20141013/9897.html 第二部分

http://blog.csdn.net/king_jensen/article/details/20376179 第三部分

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/148319.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 深入理解PHP的GC(Garbage collection)问题「建议收藏」

    深入理解PHP的GC(Garbage collection)问题

    2022年2月19日
  • linux中实现线程同步的6种方法

    linux中实现线程同步的6种方法linux线程同步的方法下面是一个线程不安全的例子:#include<stdio.h>#include<pthread.h>intticket_num=10000000;void*sell_ticket(void*arg){while(ticket_num>0){ ticket_num–;}}intmain(){pthread_tt1,t2,t3;pthread_create(&t1,NU

    2022年7月15日
  • webpack基础打包命令_webpack打包命令

    webpack基础打包命令_webpack打包命令没有配置文件的打包如果我们没有使用配置文件webpack.config.js,那么我们就需要通过命令来打包案例我们首先创建一个webpackTest文件夹,然后在文件夹中再创建2个子文件夹dis

    2022年7月30日
  • [原创] 仿滴滴出行打车APP定位导航,增加RFID认证、海外版、司机证件号码识别功能

    [原创] 仿滴滴出行打车APP定位导航,增加RFID认证、海外版、司机证件号码识别功能这是我自己做的一个仿滴滴打车的Android出行项目,主要针对滴滴等出行平台一直饱受质疑的“人车不符”问题,以及当前越发火热的或计划和出海战略,给出行项目增加了下面几个功能:1.RFID识别验证功能:在司机证件或者车内识别硬件嵌入RFID识别芯片,乘客使用手机读取到芯片信息,并且通过网络发送到出行平台数据库进行验证(我用JNI加了一个C语言的MD5加密算法对识别到的信息进行了加密)。如果不是合规的“人”或“车”,则不能完成订单并向平台或监管单位汇报当前位置。

    2022年7月24日
  • Visual Studio 2010 正式旗舰版 序列号「建议收藏」

    Visual Studio 2010 正式旗舰版 序列号「建议收藏」发布vs2010正式旗舰版序列号一枚YCFHQ-9DWCY-DKV88-T2TMH-G7BHP安装完试用版,添加/删除程序里面激活即可。。。已经测试通过,不知道能不能激活Professional和P

    2022年7月4日
  • 冒泡排序法c语言代码_用冒泡法对数组a进行排序

    冒泡排序法c语言代码_用冒泡法对数组a进行排序选择法排序选择法排序是指:如果要把一个数组从小到大排列,那么就从该数组中依次选择最小的数字来排序。从第一个数字开始,将第一个数字与数组中剩下数字中最小的那一个交换位置,然后将第二个数字与剩下数字中最小的那个交换位置,以此类推,直到最后一个数字。例如输入数组{7,5,4,8,6,2,3}第一次排序通过查找最小的数字,交换7与2的位置;第二次查找5后面最小的数字,找到了3,交换5与3的位置;第三次查找4之后最小的数字,发现并没有数字比4小,交换4与4的位置(相当于没有改变);第四次查找8后面最小的数字5,

    2022年9月13日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号