静态库简单学习

有时候想写个静态库玩玩练练手,做了一次之后,时间久了又给忘了步骤。今天就简单的记录一下。便于日后的记忆。

什么是库?
  • 程序代码的集合,共享程序代码的一种方式
库分为 开源 和 闭源库-->
  • 闭源库分 为静态库.a 和 .framework
  • 动态库: .dylib 和 .framework
静态库和动态库的使用区别
  • 静态库: 链接时。静态库会被完整的复制到可执行的文件中。被多次使用就会有多次复制拷贝。有冗余 。比如系统 中 程序a 和 程序b 都是用了 静态库 .a 那么 .a 就会在系统中加载2次

*动态库: 系统中 。程序a 和 程序 b 都使用了某个动态库 .dylib那么程序运行时由系统加载到内存,系统只加载一次,供一个多个程序使用,节省内存。但苹果不支持 使用 第三方 动态库上传到 App Store 。会被拒绝

静态库 还有一个用处,可以打包mrc 的第三方,变成静态库。然后倒入工程这样就不需要我们手动在去管理了

如何生存静态库

1, 创建工程
静态库简单学习_第1张图片
屏幕快照 2018-01-13 下午10.24.05.png

2,删除系统生成的文件。创建自己的文件
静态库简单学习_第2张图片
屏幕快照 2018-01-13 下午10.32.28.png

写自己想要的方法。在 .h 文件中。然后.m 中实现![
静态库简单学习_第3张图片
屏幕快照 2018-01-13 下午10.33.41.png
静态库简单学习_第4张图片
屏幕快照 2018-01-13 下午10.33.41.png

3, 在工程中。声明头文件,这样就可以把生成的.a 文件的头文件暴露出去了


静态库简单学习_第5张图片
屏幕快照 2018-01-13 下午10.37.45.png
如果点制作静态库中我们需要往里面丢图片。有资源文件。那么我么做一个 bundle 文件,专门存放资源文件。
静态库简单学习_第6张图片
屏幕快照 2018-01-13 下午11.02.10.png
静态库简单学习_第7张图片
屏幕快照 2018-01-13 下午11.02.39.png

我们把图片等丢在bundle 里面。然后在静态类、声明如何拿到资源文件,如图
静态库简单学习_第8张图片
屏幕快照 2018-01-13 下午11.09.31.png

声明

静态库简单学习_第9张图片
屏幕快照 2018-01-13 下午11.09.43.png

4,这样 command + b 编译即可。就会生成 静态库
静态库简单学习_第10张图片
屏幕快照 2018-01-13 下午10.41.28.png

5,查看 show a finder 找到.a 和 .h 头文件


静态库简单学习_第11张图片
屏幕快照 2018-01-13 下午10.42.43.png
屏幕快照 2018-01-13 下午10.42.51.png

另外一个工程要使用就导入 .a 和 .h 即可

6, 这样我们就做好了静态.a 和 头文件,再把bundle 一起放在一个 lib 文件夹
静态库简单学习_第12张图片
屏幕快照 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$ 

下面是合并后的文件


静态库简单学习_第13张图片
09C552BB-D1F3-4EA1-94D0-70EB71CCBA67.png

现在就完成了。 把 XC_tool.a XCTools.bundle XC_tools.h 放在lib文件夹即可给其他人使用


静态库简单学习_第14张图片
屏幕快照 2018-01-13 下午11.30.04.png

如何调试静态库 ,我这里的环境是 Xcode 9.1

1,创建一个新的工程。

2, 选择新的工程的
静态库简单学习_第15张图片
22BB5C60-9D5B-49EB-8162-B98029D62795.png

3,选择你需要创建的静态库,
静态库简单学习_第16张图片
屏幕快照 2018-01-14 下午10.06.23.png

4,我这里创建了xc_tools
静态库简单学习_第17张图片
屏幕快照 2018-01-14 下午10.08.08.png

5,在xctools 写完你想写的方法 。然后


静态库简单学习_第18张图片
屏幕快照 2018-01-14 下午10.11.26.png

选择 xc_tools 然后 编译 。会生成 .a 静态库、然后我们重新选择 工程文件

6,在viewController 文件,引入 静态库头文件xc_tools.h ,然后使用xc_tools.h的方法 如图 。


静态库简单学习_第19张图片
屏幕快照 2018-01-14 下午10.29.33.png

编译会报错。


静态库简单学习_第20张图片
屏幕快照 2018-01-14 下午10.16.34.png

可以看到报错原因, viewController 有引用到 xc_tools 的方法 , link 失败 ,因为没有导入 在工程文件设置 .a target dependencies(目标依赖关系) 和 link binary with libraries (链接库) 。我们需要在如图位置

静态库简单学习_第21张图片
751BA137-BA65-4E2F-87DD-A80CAC133966.png

设置目标 静态库 ,然后 添加链接静态库


静态库简单学习_第22张图片
FEC7FC94-A143-4FEF-9BDC-7D35D3D60A0A.png

编译 sunccess 。 就可以一遍写 静态库方法,一边调试了。

动态库 framework 动态库如何打包。 步骤和上面雷同

静态库简单学习_第23张图片
屏幕快照 2018-01-14 下午11.00.27.png

选择动态库生成。、

然后进入工程。比如 自己创建一个xc_tools 类。那么 我们需要如图


静态库简单学习_第24张图片
19F832B7-4E6F-4E7A-A9E1-E31477866235.png

这个的作用就是打包的 framework 头文件暴露出去。

在使用的时候注意 。在General 下面的


静态库简单学习_第25张图片
屏幕快照 2018-01-14 下午11.04.13.png

注意把我们的动态库。添加到这里面就好。不然会在使用的时候报错

/// 因为 动态库不可以上传到 app store
那么 怎么把动态换成静态呢 如图


静态库简单学习_第26张图片
BB5834E3-39CA-48FC-8EF2-DC1B8DF949A4.png

这样设置后编译即可

你可能感兴趣的:(静态库简单学习)