静态库的制作
1 静态库的存在形式: .a 和.framework
动态库的存在形式:.dylib 和.framework
2 静态库和动态库的区别: 静态库在链接的时,会被完整的复制到可执行文件中,被使用多次,就由多份拷贝。
动态库则不会被复制,只有一份,程序运行时,动态加载到内存,系统只加载一次,多个程序共用
但是:程序中如果使用自己的动态库是不允许上架的。
3 使用静态库,可以保护核心代码,将MRC的项目打包成静态库,就可以在ARC环境下直接使用。
4 静态库的特点: .a(静态录库) + .h 看不到具体实现的代码
演练:一般情况下: 如果有个别mrc文件需要参与到编译中,可以做如下改动,但是有很多的话,需要使用静态库。MRC的项目打包成静态库,在ARC环境下也可以使用。
(二)静态库的制作
<一>.a静态库的制作:
1、创建一个静态库(选右边的是.a的静态库的制作,选左边的是.framework的静态库的制作)
创建的静态库中的文件和静态库的名称是一样的。
2、假使你有一个项目文件,需要生成一个静态库。
在模拟器上生运行的成静态库
在真机上生成的静态库
点击libtest.a,showinFinder:
但是要想将文件打包给别人,还需要一个.h文件。可以直接将.h文件拷贝过来,但是如果项目很大,有很多
个.h文件,这个时候就比较麻烦,可以选择这样操作:
然后,再编译一下!!!就可以运行了
测试静态库:
将生成的模拟器的文件导进来
需要的注意的地方:
1 、在模拟器上面,就用静态库生成的模拟器的包,如果不用,会报错!!!!
2、在6s,6,5s(5s以上)编译都可以成功,但是选用iphone5就会报错。
原因是:架构不同
查看架构,终端:
因为架构不一样,适用的版本不一样,要想都兼容不同的模拟器,可以选择不同的编译器,重新编译,但是也可以
使用另一种方法,更为方便一点:
将yes改为no,编译不活跃的状态下的架构。
再次编译:发现两个个都支持:
但是真机调试的还是不可以。
静态库的两个版本,一个是调试版本,一个是发布版本。
这个是release模式:
然后下面的会变红:
此时,再次编译一下(分别选择模拟器和真机):
showinFinder会出现4个文件夹:
做测试:在release下面,会出现不打印的情况。这个时候需要做得更改就是,将release模式改为debug。
所以最后我们一般给别人的,是生成的release模式下的静态库。
<二>.framework静态库的制作:
1、
但是这边有一个问题,需要手动勾选一下,是静态库还是动态库,因为动态库也是有.framework文件的。
(在后面有提示到!!!!!)
2、测试用的代码:
3、将.h文件暴露出去。
正常上面的操作完成后,会编译成功,但是报错了,我做了如下尝试:
修改项目的名称:
1、在创建文件的时候,将下面的勾去掉
2、这次的项目名称是test1,(猜测是因为我上面项目中有空格)
选择模拟器和真机分别编译。
点击test1.framework,showinFinder:
这个也是同样地可以通过命令行可以查看,因为生成的
3、同样的,不同的模拟器以及真机,使用的架构不一样,所以可以这样操作:
真机上面需要编译一次,模拟器上面也需要编译一次
4、测试framework静态库
编译的时候不会报错,但是运行的时候会报错!!!
错误信息如下:
解决方法:
因为这个静态库是自定义的(本身就是动态库),还需要在动态库的地方添加上去。
这样就可以运行成功!
但是这个意味着,刚才.frame生成的是动态库,要想生成静态库做如下操作。
这个时候再次编译一下,生成的才是静态库。
直接测试:
上述生成的是debug版本,想生成的release版本,和.a静态库的做法是一样的(参照上面)
5、.a静态库和. framework静态库有什么区别:
.a静态库是一个纯二进制文件,.framework中除了有二进制文件之外还有资源文件
.a文件不能直接使用,至少要配合.h文件,.framework文件可以直接使用
.a + .h +sourceFile = . Framework
建议使用. Framework
6、静态库开发中常见的问题:
(1)有些第三方库会使用的图片以及素材,这写素材放在哪里?
由于Xcode默认在编译的时候,会把所有的素材文件导入到mainbundle中,可能与使用静态库文件冲突。
解决方法:在静态中使用bundle文件夹。在资源图片等放到这个包中。
(2)如果需要暴露的头文件过多,怎么办?
建议用一个主头文件包含其他文件,单独泄露出去。
(3)如果想调试静态库怎么办?创建复合文件!
测试:
现在就可以任意调试:
(4)将模拟器和真机的静态库结合:
但是,这个生成的综合文件的大小是模拟器和真机综合的2倍,所以一般不建议使用合并的。
在mrc中生成的项目,打包成静态库,可以在arc环境下直接使用
1、先将环境改成mrc。
如果只有个别的mrc的文件,可以单独改成的mrc环境下的。
但是有很多mrc文件的话,需要打包成静态库
如果想生成真机和模拟器通过的文件,可以这样操作
但是整个包会变得比较大,很少用。