iOS - 关于静态库的其他问题

一、Debug 和 Release 版本区别

1、Release 是发行版本,比 Debug 版本有一些优化,文件比 Debug 文件小,想要发布时,也就是说需要大众客户使用时,需要 build Release 版本,
2、Debug 是调试版本,Debug 和 Release 调用两个不同的底层库。我们开发者自己内部真机或模拟器调试时,使用 Debug 模式就好。
3、Debug 是调试版本,包括的程序信息更多
4、只有 Debug 版的程序才能设置断点、单步执行、使用 TRACE/ASSERT 等调试输出语句
5、Release 不包含任何调试信息,所以体积小、运行速度快

使用时可以直接使用 Release 版本

为什么要把所有类型包合并

不用合并,使用时可以直接使用 Release 版本。

二、打包环境配置

Pasted Graphic 1

Build Active Architecture Only:Yes 表示只编译选中模拟器对应的架构,No 则为编译所有模拟器支持的cup架构(Debug 的 Yes 状态改为 No 即可)

-ObjC:在用第三方库时,我们常常在Xcode的Build Settings 下 Other Linker Flags 里面加入 -ObjC 标志,它和 Objective-C 的一个重要特性:类别(category)有关。
根据这里的解释,Unix 的标准静态库实现和Objective-C的动态特性之间有一些冲突:Objective-C没有为每个函数(或者方法)定义链接符号,它只为每个类创建链接符号。
这样当在一个静态库中使用类别来扩展已有类的时候,链接器不知道如何把类原有的方法和类别中的方法整合起来,就会导致你调用类别中的方法时,出现”selector not recognized”,也就是找不到方法定义的错误。
为了解决这个问题,引入了-ObjC 标志,它的作用就是将静态库中所有的和对象相关的文件都加载进来。

-all_load 和 -force_load:上面添加 -ObjC 并不能解决所有的引用问题,在64位的Mac系统或者iOS系统下,链接器有一个bug,会导致只包含有类别的静态库无法使用-ObjC标志来加载文件。
变通方法是使用-all_load或者-force_load标志,它们的作用都是加载静态库中所有文件,不过all_load作用于所有的库,而-force_load后面必须要指定具体的文件他们加载的位置也是在Xcode的Build Settings下Other Linker Flags里面。

Mach-O的编译方式 :默认选择的是Dynamic Library(动态库),要手动选择Static Library(静态库)

三、多层库嵌套

1.导入所有要打包的文件和其他第三方静态库
正常导入要打包的文件就可以了,在导入第三方静态库的时候要注意,不要选择添加到target中,如果添加进去要去target里面把第三方静态库删掉(只需导入,不要添加进target)

044_2

导入第三方静态库之后再link依赖的系统库,像这样:

044_03

四、Swift 打包

步骤细节都和 oc 是一致的。

工程直接引用其他工程

看到比较早的教程是,直接把另一个b工程拖进a工程,然后在 header search paths 配置路径。路径右边的设置为:recursive(递归查找文件)。

但测试后无效,无法引用 b 工程内的文件。

------本文结束 感谢阅读------

本文地址:http://kaaaaai.cn/articles/044.html
本文基于 知识共享署名-相同方式共享 4.0 国际许可协议发布
转载请注明出处,谢谢!

众筹项目:拯救世界!
0%