静态库与动态库

库(library)就是一堆对象文档(.o文件)的归档,是一段编译好的二进制代码,加上头文件来供别人使用。

使用库的情况:

  1. 当我们想封装代码给别人使用而不想别人看到源码
  2. 当代码不会经常改动,可以将其打包成库,减少编译时间

静态库

静态库:在静态链接时会被直接复制目标程序中,这样在编译完成后程序并没有外部依赖,但是目标程序会变大

静态库在windows中为.lib mac和linux下为.a mac下还有 .framework

动态库

动态库:动态库在静态链接时并不会被拷贝到目标程序中,目标程序只会存储指向动态库的引用,程序运行时,动态库才会真正加载进来,动态库不需要拷贝到程序中,不影响程序体积,同一份库可以被多个程序使用,但是使目标程序依赖于外部环境

动态库在windows下为.dll mac为.dylib和.framework linux下为.so (系统提供的framework都是动态库)

在Xcode7之后,.dylib文件替换为了.tbd文件

动态库好处:

  • 代码共用: 在磁盘中只需要一份,可以让多个程序共用依赖链接
  • 易于维护: 因为是程序执行时才link的,因此lib很容易更新替换
  • 减少可执行文件体积: 不需要打包进可执行文件,因此执行文件体积就小了很多

.dylib与.tbd

.tbd是基于文本的,因此只是包含在项目中的文本文件,其作用是指向所需的.dylib二进制文件链接。因为文本文件比二进制文件小很多,因此可以减少其下载大小(在实际动态链接时,仍然链接的为.dylib文件)

.framwork

在iOS开发中还会用到Framework,在iOS8之前 只能使用苹果的framework动态库,而在iOS8之后,开发者可以自己打包framework,但是自己开发的framework还是类似静态库,需要拷贝到app中,苹果又把这种 Framework 称为 Embedded Framework

系统的.framework与.dylib

系统为什么提供了.dylib动态库还有.framework动态库
个人觉得是因为他们层级不一样,.dylib是系统操作系统内置库,底层的;.framework是开发的应用层级框架

参考资料

iOS 静态库,动态库与 Framework 浅析