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

2022-09-07 15:29:00 浏览数 (1)

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

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

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

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

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

代码语言:javascript复制
  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列表不包含此指令集,则编译将会出错:

代码语言:javascript复制
  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文件。

二、将.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文件导入需要的工程就能使用了。

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.cn/148319.html原文链接:https://javaforall.cn

0 人点赞