有时候想写个静态库玩玩练练手,做了一次之后,时间久了又给忘了步骤。今天就简单的记录一下。便于日后的记忆。
什么是库?
- 程序代码的集合,共享程序代码的一种方式
库分为 开源 和 闭源库-->
- 闭源库分 为静态库.a 和 .framework
- 动态库: .dylib 和 .framework
静态库和动态库的使用区别
- 静态库: 链接时。静态库会被完整的复制到可执行的文件中。被多次使用就会有多次复制拷贝。有冗余 。比如系统 中 程序a 和 程序b 都是用了 静态库 .a 那么 .a 就会在系统中加载2次
*动态库: 系统中 。程序a 和 程序 b 都使用了某个动态库 .dylib那么程序运行时由系统加载到内存,系统只加载一次,供一个多个程序使用,节省内存。但苹果不支持 使用 第三方 动态库上传到 App Store 。会被拒绝
静态库 还有一个用处,可以打包mrc 的第三方,变成静态库。然后倒入工程这样就不需要我们手动在去管理了
如何生存静态库
1, 创建工程2,删除系统生成的文件。创建自己的文件
写自己想要的方法。在 .h 文件中。然后.m 中实现![
3, 在工程中。声明头文件,这样就可以把生成的.a 文件的头文件暴露出去了
如果点制作静态库中我们需要往里面丢图片。有资源文件。那么我么做一个 bundle 文件,专门存放资源文件。
屏幕快照 2018-01-13 下午11.02.10.png
我们把图片等丢在bundle 里面。然后在静态类、声明如何拿到资源文件,如图
声明
5,查看 show a finder 找到.a 和 .h 头文件
另外一个工程要使用就导入 .a 和 .h 即可
6, 这样我们就做好了静态.a 和 头文件,再把bundle 一起放在一个 lib 文件夹注意点,这样是只支持 真机 或者 模拟器 i386 。我们模拟器编译和真机编译会生成2种不同的.a 为了同时在 真机和模拟器那么我们需要用控制台合并
这就是真机和模拟器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$
下面是合并后的文件
现在就完成了。 把 XC_tool.a XCTools.bundle XC_tools.h 放在lib文件夹即可给其他人使用
如何调试静态库 ,我这里的环境是 Xcode 9.1
1,创建一个新的工程。
3,选择你需要创建的静态库,
5,在xctools 写完你想写的方法 。然后
选择 xc_tools 然后 编译 。会生成 .a 静态库、然后我们重新选择 工程文件
6,在viewController 文件,引入 静态库头文件xc_tools.h ,然后使用xc_tools.h的方法 如图 。
编译会报错。
可以看到报错原因, viewController 有引用到 xc_tools 的方法 , link 失败 ,因为没有导入 在工程文件设置 .a target dependencies(目标依赖关系) 和 link binary with libraries (链接库) 。我们需要在如图位置
设置目标 静态库 ,然后 添加链接静态库
编译 sunccess 。 就可以一遍写 静态库方法,一边调试了。
动态库 framework 动态库如何打包。 步骤和上面雷同
选择动态库生成。、
然后进入工程。比如 自己创建一个xc_tools 类。那么 我们需要如图
这个的作用就是打包的 framework 头文件暴露出去。
在使用的时候注意 。在General 下面的
注意把我们的动态库。添加到这里面就好。不然会在使用的时候报错
/// 因为 动态库不可以上传到 app store
那么 怎么把动态换成静态呢 如图
这样设置后编译即可