动态库与静态库

库(Library)说⽩了就是⼀段编译好的⼆进制代码,加上头⽂件就可以供别⼈使⽤。

库的作用:

  • 隐藏代码。某些代码需要给别⼈使⽤,但是我们不希望别⼈看到源码,就需要以 库的形式进⾏封装,只暴露出头⽂件。
  • 提高编译速度。对于某些不会进⾏⼤的改动的代码,我们想减少编译的时间,就可以 把它打包成库,因为库是已经编译好的⼆进制了,编译的时候只需 要 Link ⼀下,不会浪费编译时间。

常用库文件格式:.a、.dylib、.framework、.xcframework、.tbd

xcframework

能够表示多个平台和架构的分发二进制库文件。与framework相比优势:

  1. 可以用单个文件提供多个平台的分发二进制文件
  2. 与Fat Header 相比,可以按照平台划分,可以包含相同架构不同平台的文件
  3. 在使用时,不需要再通过脚本去剥离不需要的架构体系

.tdb

本质上就是⼀个YAML描述的⽂本⽂ 件。作⽤是:

  • ⽤于记录动态库的⼀些信息,包括导出的符号、动态库的架构信息、动态库的依赖信息
  • ⽤于避免在真机开发过程中直接使⽤传统的dylib。
  • 对于真机来说,由于动态库都是在设备上,在Xcode上使⽤基于tbd格式的伪 framework可以⼤⼤减少Xcode工程占用的空间⼤⼩。

Framework

将库的⼆进制⽂件,头⽂件和有关的资源⽂件打包到⼀起,⽅便管 理和分发。我们生成的Framework 和系统的 UIKit.Framework 还是有很⼤区别。系统的 Framework 不需要拷⻉到⽬标程序中,我们⾃⼰做出来的 Framework 哪怕 是动态的,最后也还是要拷⻉到 App 中(App 和 Extension 的 Bundle 是 共享的),因此苹果⼜把这种 Framework 称为 Embedded Framework

Embedded Framework:开发中使⽤的动态库会被放⼊到ipa下的framework⽬录下,基于沙盒运⾏。不同的App使⽤相同的动态库,并不会只在系统中存在⼀份。⽽是会在多 个App中各⾃打包、签名、加载⼀份。

.swiftmodule

在 Xcode 9 之后,Swift 开始⽀持静态库。

Swift 没有头⽂件的概念,那么我们外界要使⽤Swift中⽤public修饰的类和函数 怎么办?

  • Swift库中引⼊了⼀个全新的⽂件.swiftmodule。
  • .swiftmodule 包含序列化过的 AST(抽象语法树,Abstract Syntax Tree),也包含 SIL(Swift 中间语⾔,Swift Intermediate Language)。

常用架构:

  • iOS/iPad:arm64
  • iOS/iPad Simulator:x86_64 arm64
  • Mac Catalyst: x86_64 arm64
  • Mac: x86_64 arm64

静态库

静态库即静态链接库:可以简单的看成⼀组⽬标⽂件的集合。即很多⽬ 标⽂件经过压缩打包后形成的⽂件。Windows 下的 .lib,Linux 和 Mac 下的 .a。Mac独有的.framework。

静态库默认仅将⽤到的⽂件链接进去。

缺点: 浪费内存和磁盘空间,模块更新困难

动态库

动态库在编译时并不会被拷⻉到⽬标程序中,⽬标程序 中只会存储指向动态库的引⽤。等到程序运⾏时,动态库才会被真正加 载进来。格式有:.framework、.dylib、.tdb。

缺点:会导致⼀些性能损失。但是可以优化,⽐如延迟绑定(Lazy Binding)技术

动态库使用到的几个常量:

  • @rpath:运⾏时@rpath指示dyld按顺序搜索路径列表,以找到动态库。 @rpath保存⼀个或多个路径的变量
  • @executable_path:表示可执⾏程序所在的⽬录,解析为可执⾏⽂件的绝对路径。
  • @loader_path:表示被加载的Mach-O 所在的⽬录,每次加载时,都可能 被设置为不同的路径,由上层指定。

workspace

workspace 作用:

  1. 可重⽤性。多个模块可以在多个项⽬中使⽤。节约开发和维护时间。
  2. 节省测试时间。单独模块意味着每个模块中都可以添加测试功能。
  3. 更好的理解模块化思想。

你可能感兴趣的:(动态库与静态库)