静态库的制作详解

静态库的制作

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文件的话,需要打包成静态库

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

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

时间: 2024-10-29 12:05:10

静态库的制作详解的相关文章

xcode 制作静态库.a文件 详解

http://blog.csdn.net/kepoon/article/details/21516977 最近在做Apple的IOS开发,有开发静态库的需求,本身IOS的开发,只允许静态库或者Framework.在Xcode上没有找到允许编译,如同Android上的*.so和Win32上的dll这样的说法.不过Framework这样的框架,估计也是类似动态库的实现,不过没有具体研究过,后续继续深入研究. 我这个文档的静态库的开发是基于Xcode4.2和iOS SDK5.0编写的.Xcode4跟之

[C] linux静态链接库与动态链接库详解

http://blog.chinaunix.net/u2/76292/showart.php?id=1274181 一顺便说说了哦  通常情况下,对函数库的链接是放在编译时期(compile time)完成的.所有相关的对象文件(object file)与牵涉到的函数库(library)被链接合成一个可执行文件(executable file).程序在运行时,与函数库再无瓜葛,因为所有需要的函数已拷贝到自己门下.所以这些函数库被成为静态库(static libaray),通常文件名为"libxx

&quot;静态方法里只能调用静态变量和静态方法&quot;详解

静态方法里可以调用静态方法和静态变量,同时也能调用非静态方法和非静态变量. public class Test { public Test() {}; public Test(int i) {this.n = i;} public static int m = 5; public int n = 10; public void fun1() {System.out.println("非静态方法fun1");} public static void fun2() {System.out.

iOS开发笔记--静态库的制作与使用

一.iOS项目中库的使用 1.开源库 * 公开源代码,能看到具体实现 *比如SDWebImage.AFNetworking 2.闭源库 * 不公开源代码,是经过编译后的二进制文件,看不到具体实现 * 主要分为:静态库.动态库(注意自己制作的动态库不能上传到appStore) 二.本文首先讲的的是静态库的制作以及使用 1.新建静态库项目 新建静态库项目选择cocoa Touch Static Library 然后编写核心代码 2.分别在真机和模拟器下编译生成对应环境的静态库 (注意真机文件夹下得静

【Solr】索引库查询界面详解

目录 索引库查询界面详解 回到顶部 索引库查询界面详解 q:主查询条件.完全支持lucene语法.还进行了扩展. fq:过滤查询.是在主查询条件查询结果的基础上进行过滤.例如:product_price:[10 TO 20] sort:排序条件.排序的域asc.如果有多个排序条件使用半角逗号分隔. start, rows:分页处理.Start起始记录rows每页显示的记录条数. fl:返回结果中域的列表.使用半角逗号分隔. df:默认搜索域. wt:响应结果的数据格式,可以是json.xml等.

静态库的制作与使用

静态链接库与动态链接库都是共享代码的方式.如果采用静态链接库,则无论你愿不愿意,lib中的指令都被直接包含在最终生成的.ExE文件中了.但是若使用动态链接库,该动态链接库则不必被包含在最终的EXE文件中,EXE文件执行时可以“动态”的引用和卸载这个与EXE独立的动态链接库文件.静态链接库和动态链接库的另外一个区别在于静态链接库中不能再包含其他动态链接库或者静态库,而在动态链接库中还可以包含其他的动态或静态链接库.本次就针对静态库的制作和使用进行讲解. 首先静态库有两种,一种是对函数产生的静态库,

CentOS7全自动安装光盘制作详解

CentOS7全自动安装光盘制作详解 1 复制光盘文件 1 )挂载 iso 镜像 创建目录用于挂载光盘: perl"> mkdir /root/centos7 挂载 iso 镜像 mount -o loop CentOS-7.0-1406-x86_64-DVD.iso/root/centos7 2 )复制光盘文件到编辑目录进行编辑 因为挂载上 iso 镜像是只读的,如果要编辑,需要将文件复制出来,再编辑. 首先创建编辑目录: mkdir /root/centos7_iso 复制光盘文件:

c/c++ 标准库 bind 函数 详解

标准库 bind 函数 详解 bind函数:接收一个函数名作为参数,生成一个新的函数. auto newCallable = bind(callbale, arg_list); arg_list中的参数可能包含入_1, _2等,这些是新函数newCallable的参数. 在这篇博客lambda 表达式 介绍 中,讨论了find_if的第三个参数的问题,当时是用lambda表达式解决的,有了bind函数后,也可以用bind函数解决. 解决办法:bind(check_size, _1, sz) au

Linux中的静态库的制作和使用

一.整体大纲 二.静态库的制作 1)命名规则        lib + 库的名字 + .a        例如:libmytest.a2)制作步骤:        1). 生成对应的.o文件 -- .c --> .o   -c        2). 将生成的.o文件打包  ar rcs + 静态库的名字(libMytest.a) + 生成的所有的.o3)发布和使用静态库:        1). 发布静态库        2). 头文件4)优缺点: 三.静态库的打包 详细制作示例可看博客:http