iOS静态库的编译与打包
一.概念
1.什么是库
就是程序代码的集合,是共享程序代码的一种方式。
2.库的分类
以上图为例,第三方程序代码的开源情况为标准,库可以分为两类
1)开源库
源代码是公开的,你可以看到具体实现。比如GitHub上比较出名的第三方框架AFNetworking、SDWebImage。
2)闭源库
源代码不公开,只公开调用的接口,看不到具体的实现,是一个编译后的二进制文件。这种常见于一些公司的SDK包,比如高德地图SDK、环信即时通讯SDK等等。而闭源库又分为两类:静态库和动态库。
3.静态库和动态库的区别
1)静态库链接时会被完整的复制到可执行文件中,被多次使用就有多份拷贝。
2)动态库链接时不复制,程序运行时由系统动态加载到内存,供程序调用。而且系统只加载一次,多个程序共用,节省内存。
4.iOS设备架构
4s-5: i386
5s-7 Plus: x86_64
5s-7 Plus: x86_64
2)真机(静态库只要支持了armv7,就可以在armv7s的架构上运行)
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
arm64: iPhone 5s 以及之后所有机型
armv7: iPhone 3Gs、iPhone 4、iPhone 4s、iPad、iPad 2
armv7s: iPhone 5、iPhone 5c
arm64: iPhone 5s 以及之后所有机型
二.静态库编译打包(基于Xcode9.2)
1.".a"文件
1)在Xcode中新建一个静态库项目
![](https://images2018.cnblogs.com/blog/1104211/201803/1104211-20180326142750433-152916177.png)
2)在testLib类中新建一个类方法用于测试
![](https://images2018.cnblogs.com/blog/1104211/201803/1104211-20180326143049365-48971500.png)
![](https://images2018.cnblogs.com/blog/1104211/201803/1104211-20180326143102217-1815040792.png)
3)设置公开的接口文件
![](https://images2018.cnblogs.com/blog/1104211/201803/1104211-20180326143452879-1056931157.png)
4)设置适配所有设备类型架构(否则只能运行在当前选择的特定设备架构上)
![](https://images2018.cnblogs.com/blog/1104211/201803/1104211-20180326144005802-117553864.png)
5)打包运行,需要注意的是运行设备选择的是模拟器,那么编译出来的.a包仅支持模拟器的架构,反之手机依然。最终得到的文件即为编译打包过的静态库文件。
![](https://images2018.cnblogs.com/blog/1104211/201803/1104211-20180326144321754-266031045.png)
![](https://images2018.cnblogs.com/blog/1104211/201803/1104211-20180326144712782-701956742.png)
![](https://images2018.cnblogs.com/blog/1104211/201803/1104211-20180326144911781-1108944779.png)
![](https://images2018.cnblogs.com/blog/1104211/201803/1104211-20180326144920928-1191651499.png)
2.".framework"文件
1)在Xcode中新建一个.framework静态库项目
![](https://images2018.cnblogs.com/blog/1104211/201803/1104211-20180326145358387-104460389.png)
2)在工程中新建一个测试类,并在类中新建一个类方法用于测试
![](https://images2018.cnblogs.com/blog/1104211/201803/1104211-20180326145729784-970268459.png)
![](https://images2018.cnblogs.com/blog/1104211/201803/1104211-20180326145741839-1281351561.png)
3)设置公开的接口文件,需要注意若想公开测试类中的方法,需要将测试类的头文件从Project拖入Public中
![](https://images2018.cnblogs.com/blog/1104211/201803/1104211-20180326150011506-1210271179.png)
4)设置适配所有设备类型架构(否则只能运行在当前选择的特定设备架构上)
![](https://images2018.cnblogs.com/blog/1104211/201803/1104211-20180326150241571-76695254.png)
6)设置.framework编译为静态库
![](https://images2018.cnblogs.com/blog/1104211/201803/1104211-20180326150642265-890407582.png)
7)打包运行,需要注意的是运行设备选择的是模拟器,那么编译出来的.framework包仅支持模拟器的架构,反之手机依然。最终得到的文件即为编译打包过的静态库文件。
![](https://images2018.cnblogs.com/blog/1104211/201803/1104211-20180326151050035-484076314.png)
![](https://images2018.cnblogs.com/blog/1104211/201803/1104211-20180326151121835-1481410067.png)
![](https://images2018.cnblogs.com/blog/1104211/201803/1104211-20180326151059900-1990731447.png)
3.测试编译和生产编译的区别
苹果官方对应用开发的测试环境和生产环境有严格区分,编译静态库也是如此,在打包之前注意调整scheme的设置。debug对应测试环境,release对应生产环境。
![](https://images2018.cnblogs.com/blog/1104211/201803/1104211-20180326151430991-1001033276.png)
![](https://images2018.cnblogs.com/blog/1104211/201803/1104211-20180326151446896-1134812050.png)