ios-.a静态库在模拟器和真机上的使用情况

来源:互联网 发布:centos怎么安装服务器 编辑:程序博客网 时间:2024/06/15 10:07

我们可以自己去创建一个.a的静态库,我们可以下面所示的形式进行创建

创建出来之后,我们可以往其中创建一些类,写我们想要写的方法,然后我们再去点击运行程序就可以了,在模拟器上运行和真机上运行生成的文件是不一样的。

首先项目的结构如下所示

生成的文件如果我们分别运行的话是会有两个的


这里需要注意的是,如果我们创建的类有多个的话,include的里面包含的是头文件,并不会把我们定义的所有类的头文件都放进去,而是默认把我们创建项目的时候自动创建的第一个文件加入进去,如果我们想去添加的话,可以在如下所示中进行添加。下面的Subpath就是我们的.h文件存放的位置。

这里需要注意的是,如果我们把模拟器生成的静态库文件想要在真机上运行时不可以运行的因为架构不同,会报如下的错误


如果是真机上生成的静态库文件想要在模拟器上使用会报下面的错误

原因其实很简单因为不同设备的指令集。说到指令集这个问题,我们需要知道下面的这些概念

在模拟器上是没有指令集的,编译运行使用的是mac上的指令集,以及不同模拟器和真机之间的处理器的架构也是不一样的。

模拟器32位的处理器需要i386的架构,比如说4S/5   64位的模拟器则需要x86_64的架构5S之后的。

我们可以在终端中查看我们生成的.a文件的架构是什么,首先进入你创建的静态库的文件夹下面包含.a文件的,然后输入lipo -info 文件名.a

然后就会输出了,如下图所示



查看友盟的.a静态库的架构如下所示,包含了五种架构


其中真机的架构分为armv7 armv7s arm64 还有arm6。

arm6主要是在iPhone、iPhone2、iPhone3G、第一代、第二代 iPod Touch中使用,所以我们不需要去管了。

arm7 是在3GS / 4 / 4S 上的指令集。

armv7s 5 / 5C

arm64 是从5S开始到之后的设备


如果我们想让我们制作的静态库.a文件支持模拟器的两个架构的话就是i386和x86_64的话

我们就可以通过合成命令lipo -create 静态库1.a  静态库2.a -output Tools.a 就比如说你静态库1支持的是i386,静态库2支持的是x86_64,这样就可以让这个生成的静态库文件支持那两个架构了。

还有一种方法就是通过设置如下图所示的配置,设置Debug模式下为NO,如果Debug为YES的话,就表示只生成运行着的当前所运行设备的架构,所以我们改成NO就可以让模拟器生成模拟器的所有架构,真机生成真机的所有架构

如果我们的库又要合成i386 x86_64 arm7 armv7s arm64 的话,我们可以通过上面用合成命令的方式来把一个是支持模拟器的全部架构的.a和真机的全部架构的.a文件就可以了

还有一点需要注意的是在Xcode6及以后,我们做了上面的配置,Xcode将不会默认输出有armv7s我们需要自己去配置。在如下所示进行配置


下面又两个地方需要注意的一个就是Architecetures,指定工程被编译成可支持哪些指令集类型

还有一个就是Valid Architectures,限制可能被支持的指令集的范围,也就是Xcode编译出来的二进制包类型最终从这些类型产生,而编译出哪种指令集的包,将由Architectures与Valid Architectures(因此这个不能为空)的交集来确定。

总结一下Build Active Architecture Only 就是指的是是否只对当前运行的设备所支持的指令集编译

这个属性在Debug模式下默认为yes,这样编译起来速度快,它只编译当前的设备支持的指令集,而设置为no时,会编译所有的版本,当然这个所有也分模拟器和真机。


阅读全文
0 0
原创粉丝点击