如果你经常困惑 iOS 开发中的静态库和动态库的作用与区别, 那么这篇文章可以为你解惑
![fa949874cfdfd85475f204af921e9b3f.png](https://i-blog.csdnimg.cn/blog_migrate/5a49c8947ba091e262a4eb7bd1e8aaa7.jpeg)
![2c0d413a3fbf4a0ebc205a4946a8ccef.png](https://i-blog.csdnimg.cn/blog_migrate/7f594b9e8a3a4bf54f6ef2c129cb91d7.jpeg)
静态库 (Static Libraries)
静态库简单的理解是多个目标文件 (object file
, 以 .o
为后缀) 的打包集合. 静态库的存在形式:
- Mac/iOS:
.a
或封装成.framework
- Linux:
.a
- Windows:
.lib
❝查看 object file 格式:
objdump -macho -section-headers /bin/ls
优势
- 提供的是目标文件, 所以不需要重新编译, 只需要链接即可
- 加载 App 速度更快, 因为在编译时已经进行了链接, 因此启动时不需要进行二次查找启动
动态库 (Dynamic Libraries)
动态库 (Dynamic Libraries
, 也称作 Shared Library
, Shared object
, 动态链接库
), 跟静态库一样是多个 object files
封装起来的, 但是动态库并不会在编译时直接置入 app, 而是将动态库的信息置入 app, 然后 app 在被运行的时候去动态查找动态库并进行链接, 这一步也叫做 动态链接
.
根据动态库的载入时间 (load time
) 我们将动态库分为以下两种:
动态链接库
: 在启动 app 时立刻将动态库进行加载 (随程序启动而启动)动态加载库
: 当需要的时候再使用dlopen
等通过代码或者命令的方式来加载 (在程序启动之后)
以上行为是由动态链接器 (Dynamic linker
, macOS 称 dyld
) 来完成
动态库的存在形式分为以下几种:
- MacOS/iOS:
.tbd
,.dylib
或封装成.framework
- Linux:
.so
- Windows:
.DLL
macOS 大规模地使用 shared libraries
, 可以前往路径 /usr/lib
文件夹查看系统的动态库.
![fced592a75da7f40400aacc77b95e9d5.png](https://i-blog.csdnimg.cn/blog_migrate/4a6e4ca77f0be401ca6900496f50d466.jpeg)
然而在运行时进行才做链接其实是一个笨重的负担, 应合理安排哪些库需要 load
以及时机.
优势
因为动态库不需要在编译时置入 app 中, 因此理论上体积会更小, 而且可以做到动态库内容改变所有结果文件不需要重新编译即可获得最新功能
❝以上只是对于标准的系统动态库来说的, 对于 iOS 开发来说, 因为我们只能使用
Embedding Frameworks
来使用动态库, 这样的动态库并不是真正的动态库, 其会在编译时全部置入 app, 然后在 app 启动时全部加载, 这样的话会