【iOS开发之静态库、动态库】

时间:2023-03-08 16:04:05

什么是库?

库 就是程序代码的集合, 是共享程序代码的一种方式,库一般分两类:开源库和闭源库。github*享一般是开源库;闭源库分为:静态库和动态库,闭源库不开放源代码,是经过编译的二进制文件,一般用于保护不开源的核心代码。

还可以将MRC的代码打包成静态库,运行在ARC的环境下。

静态库

静态库一般以.a和.framework结尾,静态库在链接时, 会被完整的复制到可执行文件中; 被多次使用, 就有多份拷贝;

静态库一般用于保护自己核心代码,国内的企业,掌握核心技术,同时是又希望更多的程序员来使用其技术,因此采用"闭源"的方式开发使用,如支付宝,百度地图等

静态库一般是.h和.a来结合使用,.h来暴露方法名供用户使用,.a来屏蔽具体实现。

静态库的制作

制作.a的静态库

1、打开xcode,如下图创建静态库项目。

【iOS开发之静态库、动态库】

2.设置编译静态库适用所有架构的模拟器,Build Settings -> Build Active -> NO,设置后编译生成的库使用所有模拟器。

【iOS开发之静态库、动态库】

3.选取要暴露出去的头文件,在target->Build Phases->Copy Files将要暴露的头文件加进来

【iOS开发之静态库、动态库】

4.选择模拟器(此处可随意选择,因为第2步已经设为NO,可适用于任何模拟器),然后编译项目,编译完成后左下角的.a文件由红色变为白色,即表示已经生成了静态库。如果是要在真机上使用,就要选择真机进行编译。

【iOS开发之静态库、动态库】

5.右击.a文件选择"show file in finder",在finder中找到.a文件(此处有连个文件夹,一个是simulator用于模拟器,一个是iphoneos用于真机)。include中是第3步设置的头文件,需要用时将此处.a文件和include中的.h文件拷贝到要使用静态库的项目中即可使用。

【iOS开发之静态库、动态库】

6.一般默认情况下,编译出来的都是在debug模式下使用的库,如果想制作发布阶段使用的库,可以选择edit schema->run->biuld configuration中的release版本,再编译项目,即可生成release版本的静态库。(release版本的静态库比debug的静态库略小,并去掉了很多调试用的字符)

【iOS开发之静态库、动态库】

【iOS开发之静态库、动态库】

【iOS开发之静态库、动态库】

制作.framwork的静态库

1.新建项目选.framwork的库

【iOS开发之静态库、动态库】

2.设置编译所有架构的库

【iOS开发之静态库、动态库】

3.设置要暴露的头文件(此处和.a不同),要将project栏目的头文件拖动至pubic栏目中,表示该文件可以共用。

【iOS开发之静态库、动态库】

4.最后一步,设置编译后的库是静态的,target -> Build Settings-> 搜索 Mach-o Type改为静态库。如果不设置此项默认将生成动态库。

【iOS开发之静态库、动态库】

5.使用时只需要将.framework赋值到项目中即可。

.a的静态库和.framwork的区别:

1> .a是一个纯二进制文件,  .framework中除了有二进制文件之外还有资源文件

2> .a文件不能直接使用, 至少要有.h文件的配合; .framework文件可以直接使用

3> .a + .h + sourceFile = .framework

4>  建议使用.framework

注意点:

1.如果在制作静态库时,需要添加很多图片素材,此时为了防止图片资源和使用者项目中的图片资源同名等冲突,可以在库中创建一个.bundle的资源包,将图片放入到这个包中。

2.暴露头文件过多时,可以写一个主头文件,将其他头文件都加入到主头文件,再将主头文件暴露出来。

3.在静态库制作时,想调试静态库,但又由于静态库不是正在的可运行的工程,所以没法调试。这是可以新建一个标准的ios工程,然后在该工程中再添加一个静态库工程,并将静态库添加到标准工程中,添加依赖即可调试。

【iOS开发之静态库、动态库】

【iOS开发之静态库、动态库】

动态库

动态库一般以.dylib和.framework结尾,动态库则不会复制, 只有一份. 程序运行时动态加载到内存; 系统只加载一次, 多个程序共用, 节省内存; 但是项目中如果使用到自己的动态库, 不允许上架!

制作步骤同静态库生成.framework一致,只是不需要第4步。

使用时需要在Embedded Binaries中添加导入的库才能使用

常见的报错和处理办法:

参考这篇文章

https://my.oschina.net/ioslighter/blog/363211