课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
今天烟台it培训小编跟大家讨论静态库与动态库。
对于静态库而言,在编译链接的时候,会将静态库的所有文件都添加到 目标 app 可执行文件中,并在程序运行之后,静态库与 app 可执行文件 一起被加载到同一块代码区中。
app 可执行文件: 这个目标 app 可执行文件就是 ipa解压缩后,再显示的包内容里面与app同名的文件。
对于动态库而言,在编译链接的时候,只会将动态库被引用的头文件添加到目标app 可执行文件,区别于静态库,动态库 是在程序运行的时候被添加另外一块内存区域。
下面看下苹果的官方文档中有两句对动态库和静态库的解释。
- A better approach is for an app to load code into its address space when it’s actually needed, either at launch time or at runtime. The type of library that provides this flexibility is called dynamic library.
- **动态库**:可以在 **运行 or 启动** 的时候加载到内存中,加载到一块**独立的于 app ** 的内存地址中
- When an app is launched, the app’s code—which includes the code of the static libraries it was linked with—is loaded into the app’s address space.Applications with large executables suffer from slow launch times and large memory footprints
- **静态库**:当程序在启动的时候,会将 app 的代码(包括静态库的代码)一起在加载到 app 所处的内存地址上。相比于**静态库** 的方案,使用**动态库**将花费更多的启动时间和内存消耗。还会增加可执行文件的大小。
举个栗子:假设 UIKit 编译成静态库和动态库的大小都看成 1M , 加载到内存中花销 1s . 现在又 app1 和 app2 两个 app。倘若使用静态库的方式,那么在 app1 启动的时候, 需要花销 2s 同时内存有 2M 分配给了 app1.同样的道理 加上 app2 的启动时间和内存消耗,采用静态库的方案,一共需要花销 4s 启动时间、4M 内存大小、4M 安装包大小。那么换成动态库的时候,对于启动和 app1 可能花费一样的时间,但是在启动 app2 的时候 不用再加载 UIKit 动态库 了。减少了 UIKit 的重复 使用问题,一共花销 3s启动时间、3M 内存大小、4M 安装包大小。
而很多 app 都会使用很多相同的库,如 UIKit 、 CFNetwork 等。所以,苹果为了加快 app 启动速度、减少内存花销、减少安装包体积大小,采用了大量 动态库的形式 来优化系统。dyld 的共享缓存 :在 OS X 和 iOS 上的动态链接器使用了共享缓存,共享缓存存于 /var/db/dyld/。对于每一种架构,操作系统都有一个单独的文件,文件中包含了绝大多数的动态库,这些库都已经链接为一个文件,并且已经处理好了它们之间的符号关系。当加载一个 Mach-O 文件 (一个可执行文件或者一个库) 时,动态链接器首先会检查 共享缓存 看看是否存在其中,如果存在,那么就直接从共享缓存中拿出来使用。每一个进程都把这个共享缓存映射到了自己的地址空间中。这个方法大大优化了 OS X 和 iOS 上程序的启动时间。
两者都是由*.o目标文件链接而成。都是二进制文件,闭源。