封装.a静态库

前言时间长了不用就会忘了,记录一下

参考:
https://www.jianshu.com/p/13bf46df9387
https://blog.csdn.net/u013983033/article/details/83030389

iOS 设备的CPU架构

  • 模拟器:
    4s-5: i386
    5s-7 Plus: x86_64

  • 真机(iOS设备):
    armv6: iPhone、iPhone 2、iPhone 3G、iPod Touch(第一代)、iPod Touch(第二代)
    armv7: iPhone 3Gs、iPhone 4、iPhone 4s、iPad、iPad 2
    armv7s: iPhone 5、iPhone 5c (静态库只要支持了armv7,就可以在armv7s的架构上运行)
    arm64: iPhone 5s、iPhone 6、iPhone 6 Plus、iPhone 6s、iPhone 6s Plus、iPad Air、iPad Air2、iPad mini2、iPad mini3

.a文件静态库打包

1、打开Xcode创建一个新的工程,这里以Xcode8为例,选择工程如下:

封装.a静态库_第1张图片
image

2、创建工程完毕后,再创建一个工具类StaticLibTool,添加一个方法用于测试

封装.a静态库_第2张图片
image

StaticLibTool.m文件实现如下

封装.a静态库_第3张图片
image

3、运行工程进行打包

封装.a静态库_第4张图片
image

运行完毕后,我们会看到工程中Products文件夹下的libStaticLib.a文件由红色变成了黑色。右键show in finder可以在其目录下找到它。这就是我们打包好的.a静态文件了。

封装.a静态库_第5张图片
image

但是这样就完了吗?当然没有,我们知道静态库存在的最大意义是隐藏代码的具体实现,但是这也隐藏的太彻底了,总要公开些接口或者头文件供人调用吧。

4、公开接口头文件

targets->Build Phases->Copy Files->"+"你需要公开的头文件

这里我们把新建的测试类StaticLibTool.h公开

封装.a静态库_第6张图片
image

公开头文件后,我们再按上述1、2、3流程重新运行打包,我们会得到一个头文件和一个.a静态库(如下图),而这正是我们所需要的。

封装.a静态库_第7张图片
image

5、新建一个可运行的工程,把这两个打包好的文件拖入项目测试

封装.a静态库_第8张图片
image

选择Iphone7模拟器运行,程序正常运行,点击模拟器屏幕,打印日志如下:

封装.a静态库_第9张图片
image

我们可以看到输出没有问题,打包.a静态库大功告成。

但是,别高兴的太早。当我把模拟器切换成Iphone5运行时,编译直接不通过,报错如下:

封装.a静态库_第10张图片
image

上图“Undefined symbols for architecture i386”是什么意思呢?意思是我们的libStaticLib.a静态库不支持i386架构。那i386又是什么鬼?不清楚的可以拉上去看“iOS 设备的CPU架构”,这里就不多做解释了。

iPhone 5模拟器正好是i386架构,而我们打包的静态库不支持。但是iPhone 7模拟器运行却没有问题,这说明我们打包的静态库正好支持iPhone 7模拟器 的cpu架构 x86_64。如何查看静态库所支持的架构,请看下一步。

6、终端查看静态库所支持的架构

终端->cd进入库文件路径->lipo -info 库名

封装.a静态库_第11张图片
image

上图可以看到,我们的静态库仅支持x86_64架构,也就是说此静态库只可运行在iphone5s-iphone7plus之间的模拟器设备。所以刚才我们运行iphone5模拟器时,编译会报错。

到这里就可以进一步解释下,打包静态库时,你用什么模拟器运行,打包出来的静态库就支持什么模拟器的架构,而刚才我打包时是用iPhone7运行,所以仅支持架构x86_64。那么这就太麻烦了,可以打包一个静态库支持多种架构的模拟器吗?答案是肯定的,请看下一步。

7、设置适配所有模拟器架构

project -> buildSeting -> Build Active Architecture Only 设为NO

封装.a静态库_第12张图片
image

设置完成后,我们重新运行打包静态库文件(这时你可随便选一个模拟器),按照上述第6步终端查看其支持的架构,我们可以看到终端输出的结果是同时支持 i386和x86_64,这也就意味着同时支持所有模拟器。

到这里打包.a静态库已经告一段落,但是按上述流程打包的只能在模拟器上跑,真机是不能运行的,因为ios真机设备跟模拟器的架构又不一样(怎么不一样自己拉上去看),所以还没完(我也不想啊 ),请看下一步

8、打包支持真机架构的静态库

所有流程都跟上面的一样,只是我们运行打包时要选择真机运行,如下图你可以选择自己插上去的真机,也可以选择Generic ios Devices。当然不要忘记了设置支持所有真机机型架构: Build Active Architecture Only 设为NO。

封装.a静态库_第13张图片
image

9、 合并模拟器打包和真机打包文件
1.打开终端,输入lipo -create 模拟器打包文件路径 真机打包文件路径 -output 合并文件路径

2。合并完成后利用命令lipo -info合并文件路径查看时候合并成功
如果显示这些代表合并成功,可以同时支持模拟器和真机。
armv7 i386 x86_64 arm64

10、 Edit Scheme 里面 run 需要改为release 不然打出来的包是debug形式的

11、 静态库需要支持的版本


封装.a静态库_第14张图片
在这里插入图片描述

我们可以看下打包出来的终端查看结果如下:

封装.a静态库_第15张图片
image

上图可以看到同时支持armv7和arm64,也就是支持所有ios设备。好了到此打包.a静态库算是告一段落。

12、 如果project -> buildSeting -> Build Active Architecture Only 设为NO 了还不支持 i386 和 x86_64 需要看一下第11部的地方了

.frameworke文件静态库打包

1、依然Xcode创建一个新的工程FrameworkeLib,选择工程如下:

封装.a静态库_第16张图片
image

创建完成后我们可以看到,工程本身自带一个FrameworkeLib.h文件,这是类似一个主头文件一样的东西

封装.a静态库_第17张图片
image

2、创建需要测试的类,为了方便我把上述打包.a的测试类StaticLibTool直接拖来使用。

3、设置支持所有模拟器架构或真机架构(和打包.a第7步骤一样)

4、公开头文件

target-Build Phases - Headers -把需要公开的头文件从project拖入Public

封装.a静态库_第18张图片
image

5、设置打包的是静态库。因为动态库也可以是以framework形式存在,所以需要设置,否则默认打出来的是动态库

target->BuildSetting ->搜索关键字mach->Mach-o Type 设为Static Library(这个默认选项是动态的)

封装.a静态库_第19张图片
image

6、选中真机或模拟器运行设备打包(与打包.a一样),完成后Products文件夹下的FrameworkeLib.framework文件由红色变成了黑色,右键show in finder 显示如下:

封装.a静态库_第20张图片
image

FrameworkeLib.framework拖入项目便可直接使用,这里就不再进行测试了。此外还要补充的一点是,打包静态库的时候还需注意打包的是测试版(Debug)还是发布版(Release),这个根据你自己的需求决定,而如何进行设置请下一步骤。

7、设置打包静态库的测试版和发布版(.a和.frameworke)

product -> scheme -> Edit scheme -> Run->选择Debug或Release

封装.a静态库_第21张图片
image

你可能感兴趣的:(封装.a静态库)