静态库与动态库
库
库(library)就是一堆对象文档(.o文件)的归档,是一段编译好的二进制代码,加上头文件来供别人使用。
使用库的情况:
- 当我们想封装代码给别人使用而不想别人看到源码
- 当代码不会经常改动,可以将其打包成库,减少编译时间
静态库
静态库:在静态链接时会被直接复制目标程序中,这样在编译完成后程序并没有外部依赖,但是目标程序会变大
静态库在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是开发的应用层级框架