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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 微信公众号开发基本流程

    微信公众号开发基本流程背景:过年前后做了个微信公众号项目,已经过去一段时间了,抽空回忆总结下基本流程吧,不然很快估计自己就忘了。。微信公众平台官网:https://mp.weixin.qq.com文章目录一、注册公众号二、了解公众号管理页面三、必备开发者工具的使用1.开发者文档2.在线接口调试工具3.web开发者工具4.公众平台测试账号四、细读开发者文档五、开发流程重点解析1.开发环境准备2.服务器基本配置3….

    2022年6月6日
    33
  • 小型企业局域网搭建(一)

    小型企业局域网搭建(一)小型企业局域网搭建(一)一、项目介绍1.项目简介2.系统环境二、接入层–基础网络拓扑搭建1.网络拓扑图2.VLAN划分与子网规划3.配置一层交换机三、汇聚层–没啥特别的1.配置二层交换机新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML图表FLowchar

    2022年7月12日
    24
  • pytest fixtures_pytest allure

    pytest fixtures_pytest allurefixture的优势Pytest的fixture相对于传统的xUnit的setup/teardown函数做了显著的改进:命名方式灵活,不局限于setup和teardown这几个命名conf

    2022年7月29日
    4
  • 曾國藩家書摘_曾国藩语录及诠释

    曾國藩家書摘_曾国藩语录及诠释人物简介曾国藩(1811年11月26日-1872年3月12日),中国近代政治家、军事家、理学家、文学家,与胡林翼并称曾胡。曾国藩与李鸿章、左宗棠、张之洞并称“晚清四大名臣”,官至武英殿大学士、两江总督,同治年间封一等毅勇侯,谥文正。人物评价知人之明,谋国之忠,自愧不如元辅;同心若金,功错若石,相期无负平生。-左宗棠吾师道德功业,固不待言,即文章学问,亦卓…

    2025年6月2日
    3
  • html中怎么让表格居中_html表格上下居中

    html中怎么让表格居中_html表格上下居中回答:IE6/7及IE8混杂模式中,text-align:center可以使块级元素也居中对齐。其他浏览器中,text-align:center仅作用于行内内容上。解决这个问题比较好的方式,就是为所有需要相对父容器居中对齐的块级元素设置“margin-left:Auto;margin-right:Auto”。但这个方式IE6/IE7/IE8的混杂模式中不支持,所以还要设置父容器的”text…

    2025年11月10日
    5
  • visualsvn安装教程_visualsvn使用教程

    visualsvn安装教程_visualsvn使用教程VisualSVN安装配置与使用1、所选服务器安装包:VisualSVN-Server-2.1.3.msi、2、客户端安装包:TortoiseSVN-1.6.2.16344-win32-svn

    2022年8月4日
    5

发表回复

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

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