动态库与静态库

367 阅读2分钟

framework与库的区别

  • 库是共享程序代码的方式,一般分为静态库和动态库
  • framework既是静态库又是动态库

静态库与动态库区别

  • 静态库:编译成目标文件后并没有去链接,本质上是.o文件的合集

  • 动态库:编译成目标.o文件后并去链接,然后整合在一起,链接完成的最终产物 所以,静态库可以直接链接 形成动态库

  • 静态库 + run -> .o文件集合 + 链接 app = app + 静态库代码 = 对齐 + 死代码剥离 Not Embed 不嵌入

  • 动态库 = 链接完成的最终产物 = 可执行文件 = ipa 保存这个动态库 + dyld + 路径 app = app + 动态库 = 对齐 + 完整 Embed 嵌入

符号表

计算机是根据地址来执行的,每条指令执行前都要先确定地址。动态库加载之前,谁都不知道它会被加载到哪里,也就不知道动态库里的指令的地址,只能通过符号(名称)来记录它提供给别人用的函数列表(导出表),以及它期望别人提供给他的函数列表(导入表)。库被加载后,就获得了地址。程序运行前,需要先解析符号表,确定每个符号的实际地址。

@rpath/@executable_path/@loader_path

  • @rpath:Runpath search Paths(dyld搜索路径),运行时@rpath指示dyld按顺序搜索路径列表,已找到动态库,@rpath保存一个或多个路径的变量

  • @executable_path:表示可执行程序所在的目录,解析为可执行文件的绝对路径,通常为xxx.app所在的目录路径

  • @loader_path:表示被加载的Mach-o所在的目录,每次加载时,都可能被设置为不同的路径,由上层决定,通常为xxx.app或xxx.framework所在的目录路径

tbd与XCFramework格式

  • tbd全称是text-based stub libraries,本质上就是一个YAML描述的文本文件。YAML是一个可读性高,用来表达数据序列化的格式。tbd用于记录链接动态库的必要信息,包括动态库导出符号、动态库的架构信息、动态库的依赖信息、动态库的链接路径等。 用于避免在真机开发过程中直接使用传统的dylib,对于真机来说,由于动态库都是在设备上,在Xcode上使用基于tbd格式的伪framework可以大大减少Xcode的大小

静态库与分类的联系