码迷,mamicode.com
首页 > 其他好文 > 详细

静态库的制作详解

时间:2015-12-08 22:17:23      阅读:360      评论:0      收藏:0      [点我收藏+]

标签:

静态库的制作

    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、在6s65s5s以上)编译都可以成功,但是选用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文件的话,需要打包成静态库

 

如果想生成真机和模拟器通过的文件,可以这样操作

 

但是整个包会变得比较大,很少用。

静态库的制作详解

标签:

原文地址:http://www.cnblogs.com/base0225/p/5030792.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!