iOS 静态库制作简版

静态库:分.a 和 .framework
动态库:.tbd(之前叫.dylib)和.framework

.a 和 .framework区别

.a 是一个纯二进制文件, .framework中除了有二进制文件之外还有资源文件
.a 文件不能直接使用,至少要有.h文件配合, .framework文件可以直接使用。
.a + .h + sourceFile = .framework

静态库和动态库区别

静态库:链接时会被完整的复制到可执行文件中,被多次使用就有多份拷贝。
动态库:链接时不复制,程序运行时由系统动态加载到内存,系统只加载一次,多个程序共用(如系统的UIKit.framework等),节省内存。

苹果不让使用自己的动态库,否则审核就无法通过

iOS设备的架构

模拟器

iPhone4s-iPnone5:i386
iPhone5s-iPhone7 Plus:x86_64

真机

iPhone3gs-iPhone4s:armv7
iPhone5-iPhone5c:armv7s
iPhone5s-iPhone7 Plus:arm64

支持armv7的静态库可以在armv7s上正常运行。
所以下面的步骤增加armv7s无所谓了
添加的话在Build SettingsArchitectures增加armv7s

查看动态库支持的框架
lipo -info 名字

合并, 注意:framework合并的是framework下的二进制文件
lipo -create 第一个.a文件的绝对路径 第二个.a文件的绝对路径 -output 最终的.a文件路径

生成静态库步骤

0、创建相应的项目

1、添加公开头文件

2、Build Active Architecture Only设置为NO,否则生成的静态库只支持当前设备的架构

2.1、.framework增加步骤
修改生成的Mach-o格式,因为动态库也可以是以framework形式存在,所以需要设置,否则默认打出来的是动态库,将target->BuildSetting->Mach-o Type设为Static Library

4、编译,如需要分别编译真机或模拟器 然后合成,上线的时候只导入真机就行了,为了减小体积

开发调试静态库的时候可以使用target或workspace

注意:

如果静态库中有category类,则在使用静态库的项目配置中Other Linker Flags需要添加参数-ObjC或者-all_load。
如果创建的framework类中使用了.tbd,则需要在实际项目中导入.tbd动态库。

详细过程:

从C代码到可执行文件经历的步骤是:源代码 > 预处理器 > 编译器 > 汇编器 > 机器码 > 链接器 > 可执行文件

在最后一步需要把.o文件和C语言运行库链接起来,这时候需要用到ld命令。源文件经过一系列处理以后,会生成对应的.obj文件,然后一个项目必然会有许多.obj文件,并且这些文件之间会有各种各样的联系,例如函数调用。链接器做的事就是把这些目标文件和所用的一些库链接在一起形成一个完整的可执行文件。Other linker flags设置的值实际上就是ld命令执行时后面所加的参数

-ObjC:加了这个参数后,链接器就会把静态库中所有的 Objective-C 类和分类都加载到最后的可执行文件中。

-all_load:会让链接器把所有找到的目标文件都加载到可执行文件中,但是千万不要随便使用这个参数!假如你使用了不止一个静态库文件,然后又使用了这个参数,那么你很有可能会遇到 ld: duplicate symbol 错误,因为不同的库文件里面可能会有相同的目标文件,所以建议在遇到 -ObjC 失效的情况下使用 -force_load 参数。

-force_load:所做的事情跟 -all_load 其实是一样的,但是 -force_load 需要指定要进行全部加载的库文件的路径,这样的话,你就只是完全加载了一个库文件,不影响其余库文件的按需加载。

一个简单制作 bundle 的方法:新建文件夹,重命名为 YourSDK.bundle,然后 Show Package Contents 打开,加入图片。使用图片的时候需要指明 bundle: [UIImage imageNamed:@"YourSDK.bundle/img.png"]。

参考
https://www.jianshu.com/p/90f5ec723175
https://blog.csdn.net/denggun12345/article/details/79302662
https://www.jianshu.com/p/87dbf57cfe4a

你可能感兴趣的:(iOS 静态库制作简版)