动态库与静态库解析
1.动态库和静态库的区别?
动态库代码符号表都是放到一起的,在编译时不会被拷贝到目标程序中,只会存储指向动态库的引用,运行时才会被真正加载进来。
静态库符号是以.o文件进行存储的
静态库是.o文件的集合体,再往后链接就是可执行文件或者动态库
动态库是编译链接的最终产物
可以使用 nm -pa 动静态库路径 查看
objdump -macho -d 动静态库路径 打印代码段里的内容
man ld 查看连接器手册
ar -t 静态库路径 查看.o文件
objdump -macho -d /Users/mawentao/Desktop/静态库与动态库/上课代码/05-静态库与动态库链接优化/dead\ strip/test 查看可执行文件代码段的内容
2.动静态库的空间哪个小?为什么?
动态库小,动态库没有冗余的信息,静态库有。即
动态库中的所有文件都放在Mach header 、Segment、Section、blob,而静态库每个.o下都有这四项。
有一种情况静态库.o所占的空间没有达到对齐所占的空间,就是代码比较少时静态库小,动态库是经过对齐的
3.连接器链接静态库场景的4个级别,静态库的代码剥离
-noall_load 只把APP中使用的代码加载进来
-all_load 所有代码加载进来,包括系统其他代码
-ObjC 加载与OC相关的代码
-force_load<file> 哪个静态库作为主链接,是一种解决静态库冲突的方式
ld -> 静态库 -> APP有没有用到静态库的代码,即类的代码
静态库中的分类不会链接进APP,所以静态库默认使用-all_load、-ObjC
-dead_strip 整个APP的代码剥离
ls->针对场景:就会被剥离 比如全局函数不会被链接进代码段
1.没有被入口函数使用
2.不能成为导出符号
4.静态库链接到主程序,静态库存放在什么位置?动态库呢?
动态库在APP的目录里去保存动态库的路径。
静态库的.o和APP的.o链接到了一起做了合并到了代码段。
ipa:可执行文件、签名、Frameworks(动静态库)
5.静态库与动态库与framework的关系?
framework是一种打包方式,包括静态库和动态库。
静态库:header + .a + 签名 + 资源文件
动态库:header + .dylib+ 签名 + 资源文件
静态库,系统framework不需要拷贝到APP中
动态库,自己做出来的framework(又叫Embedded Framework)哪怕是动态的 要拷贝到APP中
6.不同APP使用相同的动态库在系统中只有一份吗?
如果是系统动态库是只有一份的,
如果是Embedded Framework 动态库是会在多个APP中各自打包、签名加载一份。
7.什么是xcframework,使用有什么优势?
可以表示一个多个平台和架构的分发二进制库的先进格式。
和传统Framework相比的优势:
(1)可以用单个.xcframework文件提供多个平台的分发二进制文件
(2)与Fat Header相比,可以按照平台划分,可以包含相同架构的不同平台的文件
(3)在使用时,不需要再通过脚本去剥离不需要的架构体系。
fat 二进制 是把所有的架构放在一起
lipo -info 路径 查看Framework支持的架构
8.什么是dead strip与-ObjC参数与-force_load之间有联系吗?
没联系,针对的场景不一样。dead strip针对整个APP的文件,-ObjC、-force_load针对的静态库。
9.什么是tbd文件,在日常开发中有哪些应用场景?简单理解为动态库的描述文件。开发环境中。
text-based stub libraries ,本质是一个YAML描述的文本文件,YAML是一个可读性高,用来表达数据序列化的格式。
作用是用于记录动态库的一些信息,包括导出符号、动态库的架构信息、动态库的依赖信息;
用于避免在真机开发过程中直接使用传统的dylib.
对于真机来说,由于动态库都是在设备上,在Xcode上使用基于tbd格式的伪Framework可以大大减少Xcode的大小。
10.要减小APP的体积,应该使用静态库还是动态库,为什么?
分情况:
代码少时,用静态库。
代码多时,用动态库。
静态库.o所占的空间没有达到对齐所占空间,使用静态库,否则使用动态库。
static 修饰的作用域只在本文件