iOS开发之静态库制作(.a .frame)
什么是库?什么是静态库?还有什么库?
库是一个程序代码的集合(说的有点雷同了),那么更表面的说就是一个功能模块。
库分为静态库和动态库,静态库的主要表现方式.a或者.framework, 动态库的表现方式为.framework或者.dybib 、 .tdb; 静态库和动态库的区别就在于静态库链接时会被完整的拷贝到可执行文件中,被多次使用时就会多次拷贝;动态库是链接时不会拷贝,在运行时由系统加载到内存,提供程序使用,只会加载一次,所有程序共享。
.a 静态库文件的制作
- 创建一个Cocoa Touch Static Library

- 修改工程支持版本选项

- 修改build architecture 选项

原因:如果选择为yes,则会生成的静态库是当前模拟器或者真机的架构,并不是支持所有设备的架构。
- 添加公开头文件(TARGETS-> Build Phases->Copy Files)

- 如果需要放置图片资源或者其他资源需要创建一个.bundle文件夹(New File -> Resource->Settings Bundle)

如果需要bundle 可以用,同样需要将bundle 添加到Copy Files
获取bundle资源:
- 选择模拟器运行,打包出来的是支持模拟器的静态库,我们可以利用终端命令:lipo -info XXX.a查看静态库支持的架构;选择真机或者Generic iOS Device 生成支持真机架构的静态库,我们可以使用终端命令:lipo -create xxx1.a xxx2.a output xxx.a合成模拟器和真机通用的静态库
- 测试:将静态库和头文件导入工程项目,引入头文件,成功调起说明成功。
重要说明:run debug、release模式有什么区别:debug:1>包含程序调试信息 2>运行相对速度慢 3> 体积较大 release: 1>不包含任何调试信息以及符号信息 2>体积相对小,运行速度快
.framework的制作
- 创建Cocoa Touch Framework

- 修改Development target 为最低支持版本

- 修改Math-o Type => Static Library

-
修改Build Active Architecture Only 为NO
-
添加public header 到与工程名相同的.h文件中 =>并添加到Build phases headers=> public header(如果在.h文件中添加,未在Public Header中添加,引用时会报错=> could not build module ‘xxxx’)


- 同生成.lib静态库一样,分别选择模拟器下的debug、release 和真机下的 debug、release 编译, 同.lib 第六步
- 选择.framework 里的可执行文件,进行合成debug、release版本
关于静态库里引用三方静态库
静态库是一个独立的模块,不希望将其他的静态库打包进这个静态库,我们在添加其他静态库的时候,去掉add target XXX 选项,每个静态库都是一个单独的静态库。所以我们可以让用户选择性导入,如果原工程已经有这个库,将不需要再次导入其他静态库,如果没有,提供三方静态库提供导入。这是我的一种解决方案,当然,经过和朋友讨论,发现在三方库升级等方面维护有困难,但是,我觉得这是最大程度的避免用户导入我们sdk出现,重复链接的错误!
如果您有更好的方案,不妨提出来,我们一起共同进步!
网友评论