.a静态库的制作及使用


1.创建静态库工程,工程命名为BaseSDK,生成的.a文件名变成libBaseSDK。

.a静态库的制作及使用_第1张图片

2.删掉自动生成的文件BaseSDK.h  BaseSDK.m

.a静态库的制作及使用_第2张图片

3.添加你的实用类文件

.a静态库的制作及使用_第3张图片

4.添加Headers Phase

.a静态库的制作及使用_第4张图片

5.将暴露给外面用的头文件加入进来,加进来后要移到public中去(不移到public中也没错,只是下面第11步中不会出现.h文件,需要从库的源码中找)

.a静态库的制作及使用_第5张图片

6.然后设置编译模式,打开Xcode菜单Product--->Scheme--->Edit Scheme,改为release模式,因为最终打包是要用release模式

.a静态库的制作及使用_第6张图片

7.设置Build Active Architecture Only

.a静态库的制作及使用_第7张图片

模拟器:iPhone4s~5 : i386 iPhone5s~6plus : x86_64

真机:iPhone3gs~4s : armv7 iPhone5~5c : armv7s iPhone5s~6plus : arm64

如果Build Active Architecture Only设置为YES,那么编译出来的.a静态库就只包含当前设备的指令集。

举个例子:如果我们选择iPhone 5模拟器编译,则编译出来的.a静态库只能用iPhone4s~5模拟器跑程序,用iPhone5s~6plus,则会报找不到x86_64的APPBaseSDK库。

设置为NO,则会把所有指令集的都打包合并。因此静态库有个缺点就是静态库包比源码大很多。

8.设置最低支持版本

.a静态库的制作及使用_第8张图片

9.编译生成静态库

编译时,需要用模拟器和真机各编译一次,这样Products目录下的libBaseSDK.a静态库才会变为黑色,右键show in Finder,可以进入Products目录下。

.a静态库的制作及使用_第9张图片

10.合并模拟器和真机静态库文件libBaseSDK.a,打开终端命令如下

lipo -create /Users/zhanglinfeng/Library/Developer/Xcode/DerivedData/BaseSDK-cexmrzesjuswutaldkedwjpnpxnk/Build/Products/Release-iphoneos/libBaseSDK.a /Users/zhanglinfeng/Library/Developer/Xcode/DerivedData/BaseSDK-cexmrzesjuswutaldkedwjpnpxnk/Build/Products/Release-iphonesimulator/libBaseSDK.a -output /Users/zhanglinfeng/Desktop/libBaseSDK.a

11.使用.a静态库

将静态库拖入新建的工程,我这里拖到下图箭头所指的UseA文件夹下(如果你要拖到其他目录,就要改Library Search Paths,后面我会介绍Library Search Paths路径相关知识),再将暴露给外面用的.h文件也拖入工程,

.a静态库的制作及使用_第10张图片
.a静态库的制作及使用_第11张图片

注意:如果没有include里的.h文件.那就从库的源码中挑出一些需要暴露的.h文件。

导入头文件就可以使用了,如下图

.a静态库的制作及使用_第12张图片

注意:如果要用到静态库中的category方法,需要设置Other Linker Flags为-ObjC(注 意大小写,有些资料里大小写搞错了坑死我了)。引入了-ObjC标志,它的作用就是将静态库中所有的和对象相关的文件都加载进来本来这样就可以解决问题 了,不过在64位的Mac系统或者iOS系统下,链接器有一个 bug,会导致只包含有类别的静态库无法使用-ObjC标志来加载文件。变通方法是使用-all_load 或者-force_load标志,它们的作用都是加载静态库中所有文件,不过all_load作用于所有的库,而-force_load后面必须要指定具 体的文件。

你可能感兴趣的:(.a静态库的制作及使用)