有时候想写个静态库玩玩练练手,做了一次之后,时间久了又给忘了步骤。今天就简单的记录一下。便于日后的记忆。
什么是库?
- 程序代码的集合,共享程序代码的一种方式
库分为 开源 和 闭源库-->
- 闭源库分 为静态库.a 和 .framework
- 动态库: .dylib 和 .framework
静态库和动态库的使用区别
- 静态库: 链接时。静态库会被完整的复制到可执行的文件中。被多次使用就会有多次复制拷贝。有冗余 。比如系统 中 程序a 和 程序b 都是用了 静态库 .a 那么 .a 就会在系统中加载2次
*动态库: 系统中 。程序a 和 程序 b 都使用了某个动态库 .dylib那么程序运行时由系统加载到内存,系统只加载一次,供一个多个程序使用,节省内存。但苹果不支持 使用 第三方 动态库上传到 App Store 。会被拒绝
静态库 还有一个用处,可以打包mrc 的第三方,变成静态库。然后倒入工程这样就不需要我们手动在去管理了
如何生存静态库
1, 创建工程 屏幕快照 2018-01-13 下午10.24.05.png2,删除系统生成的文件。创建自己的文件 屏幕快照 2018-01-13 下午10.32.28.png
写自己想要的方法。在 .h 文件中。然后.m 中实现![ 屏幕快照 2018-01-13 下午10.33.41.png 屏幕快照 2018-01-13 下午10.33.41.png
3, 在工程中。声明头文件,这样就可以把生成的.a 文件的头文件暴露出去了
屏幕快照 2018-01-13 下午10.37.45.png
如果点制作静态库中我们需要往里面丢图片。有资源文件。那么我么做一个 bundle 文件,专门存放资源文件。 屏幕快照 2018-01-13 下午11.02.10.png
屏幕快照 2018-01-13 下午11.02.39.png我们把图片等丢在bundle 里面。然后在静态类、声明如何拿到资源文件,如图 屏幕快照 2018-01-13 下午11.09.31.png
声明
屏幕快照 2018-01-13 下午11.09.43.png 4,这样 command + b 编译即可。就会生成 静态库 屏幕快照 2018-01-13 下午10.41.28.png5,查看 show a finder 找到.a 和 .h 头文件
屏幕快照 2018-01-13 下午10.42.43.png 屏幕快照 2018-01-13 下午10.42.51.png
另外一个工程要使用就导入 .a 和 .h 即可
6, 这样我们就做好了静态.a 和 头文件,再把bundle 一起放在一个 lib 文件夹 屏幕快照 2018-01-13 下午11.14.59.png注意点,这样是只支持 真机 或者 模拟器 i386 。我们模拟器编译和真机编译会生成2种不同的.a 为了同时在 真机和模拟器那么我们需要用控制台合并
屏幕快照 2018-01-13 下午11.17.51.png这就是真机和模拟器2个文件夹、 那么我们先用用控制台进入 product 文件。然后进行合并操作
Last login: Sat Jan 13 23:03:10 on ttys000
zwcmacbook-pro:~ chenguimin$ cd /Users/chenguimin/Library/Developer/Xcode/DerivedData/staticDemo-erbbkpjwhmuufidtvkdyxugbbtbf/Build/Products
//合并 prodects 下面的模拟器Debug-iphonesimulator/libstaticDemo.a
// 和 prodects 下面的真机.a Debug-iphoneos/libstaticDemo.a
// 合并成功,输出 -output XC_tool.a
zwcmacbook-pro:Products chenguimin$ lipo -create Debug-iphonesimulator/libstaticDemo.a Debug-iphoneos/libstaticDemo.a -output XC_tool.a
zwcmacbook-pro:Products chenguimin$
下面是合并后的文件
09C552BB-D1F3-4EA1-94D0-70EB71CCBA67.png
现在就完成了。 把 XC_tool.a XCTools.bundle XC_tools.h 放在lib文件夹即可给其他人使用
屏幕快照 2018-01-13 下午11.30.04.png
如何调试静态库 ,我这里的环境是 Xcode 9.1
1,创建一个新的工程。
3,选择你需要创建的静态库, 屏幕快照 2018-01-14 下午10.06.23.png 4,我这里创建了xc_tools 屏幕快照 2018-01-14 下午10.08.08.png
5,在xctools 写完你想写的方法 。然后
屏幕快照 2018-01-14 下午10.11.26.png
选择 xc_tools 然后 编译 。会生成 .a 静态库、然后我们重新选择 工程文件
6,在viewController 文件,引入 静态库头文件xc_tools.h ,然后使用xc_tools.h的方法 如图 。
屏幕快照 2018-01-14 下午10.29.33.png
编译会报错。
屏幕快照 2018-01-14 下午10.16.34.png
可以看到报错原因, viewController 有引用到 xc_tools 的方法 , link 失败 ,因为没有导入 在工程文件设置 .a target dependencies(目标依赖关系) 和 link binary with libraries (链接库) 。我们需要在如图位置
751BA137-BA65-4E2F-87DD-A80CAC133966.png设置目标 静态库 ,然后 添加链接静态库
FEC7FC94-A143-4FEF-9BDC-7D35D3D60A0A.png
编译 sunccess 。 就可以一遍写 静态库方法,一边调试了。
动态库 framework 动态库如何打包。 步骤和上面雷同
屏幕快照 2018-01-14 下午11.00.27.png选择动态库生成。、
然后进入工程。比如 自己创建一个xc_tools 类。那么 我们需要如图
19F832B7-4E6F-4E7A-A9E1-E31477866235.png
这个的作用就是打包的 framework 头文件暴露出去。
在使用的时候注意 。在General 下面的
屏幕快照 2018-01-14 下午11.04.13.png
注意把我们的动态库。添加到这里面就好。不然会在使用的时候报错
/// 因为 动态库不可以上传到 app store
那么 怎么把动态换成静态呢 如图
BB5834E3-39CA-48FC-8EF2-DC1B8DF949A4.png
这样设置后编译即可