引言
静态库即静态链接库,之所以叫做静态,是因为静态库在编译的时候会被直接拷贝一份,复制到目标程序里,这段代码在目标程序里就不会再改变了.静态库的好处很明显,编译完成之后,库文件实际上就没有作用了.目标程序没有外部依赖,直接就可以运行.当然其缺点也很明显,就是会使用目标程序的体积增大.
我们可能熟识静态库但可能并未自己创建并使用,下面我将向大家讲解如何创建并使用静态库.
静态库的创建
首先我们准备好需要打包的文件,在这里我以 FMDB 第三方库为例,来给大家讲解静态库的打包.
1.创建新的项目
之后选择
创建完成之后我们将第三方库导入如下图
2.设置暴露的头文件
点击TARGETS ~> Build Phases 点击添加New Headers Phase
导入 FMDB.h 即可,我导入其他的有点多余,不过无伤大雅.咱们继续.
3.设置打包的类型
选择工具栏的 Product ~> Schemes,进入选择 Release 选项,如果想打测试包可以选择 Debug
都设置成功之后,然后我们用真机运行一下就 OK 啦,运行完之后.a静态库就打包成功
我们点击 show in finder即可找到相应的库.
在此我们需要将 libStaticLibrary.a 改为- lStaticLibrary.a .(打包结束系统会自动为我们的加上 lib 字段)
注:打包静态库时如果用的真机,则静态包只能真机运行,如果模拟器运行则只能用于模拟器运行,如果想实现两通用就要先打两个包然后通过
lipo –create Release-iphoneos/libStaticLibrary.a Release-iphonesimulator/libStaticLibrary.a –output libsqlcipher.a
即可实现整合
将下面文件夹复制到想要用的目录里即可
OK 我们的静态库就这样打包成功了!!!!!
静态库的使用
工具都准备好了,让我们应用到实际项目中吧.
1.配置文件路径
首先配置文件的路径,将静态库拖入项目中如下图所示
然后在相应位置导入.a库以及相应的FMDB.h 文件
2.设置Library Search Path
需要添加以下参数:
$(SRCROOT)/Libs/Debug-iphonesimulator$(EFFECTIVE_PLATFORM_NAME)
$(SRCROOT)/Libs/Release-iphonesimulator$(EFFECTIVE_PLATFORM_NAME)
$(SRCROOT):表示当前工程的根路径,可以在右边看到实际对应的路径
$(EFFECTIVE_PLATFORM_NAME):代表当前配置是OS,如果是模拟器则为-iphonesimulator,真机则为-iphoneos
一般第三方库只提供Release版本,如果只有Release版,则两个都设置Release即可
3.设置编译参数
Build Settings ~> Linking ~> Other Linker Flags
-all_load:会让链接器把所有找到的目标文件都加载到可执行文件中,但是千万不要随便使用这个参数!假如你使用了不止一个静态库文件,然后又使用了这个参数,那么你很有可能会遇到ld: duplicate symbol错误,因为不同的库文件里面可能会有相同的目标文件,所以建议在遇到-ObjC失效的情况下使用-force_load参数。
-force_load:所做的事情跟-all_load其实是一样的,但是-force_load需要指定要进行全部加载的库文件的路径,这样的话,你就只是完全加载了一个库文件,不影响其余库文件的按需加载
导入相应头文件即可直接调用
在运行时,遇到了.o报错
几经周折,终于找到了原因少了 sqlite3库,添加完之后直接运行.OK搞定,一切都是那么的完美
好久没有写东西了,最近不太忙,看了一些第三方的内部实现,看的不是怎么透彻,有时间跟大家分享一家,不足之处请多多批评指教,谢谢大家.
Tank