计算机基础知识点(三)、动态库与静态库
一、什么是库?
库文件其实是一个已经编译完成的二进制代码。
例如我们在编译完成iOS工程的时候,会在工程目录Products
下生成一个可执行的二进制文件,Show in Finder
直接拖到终端就可以运行。
库在使用的时候需要link
,link
方式分为两种:动态和静态,所以库我们一般分为静态库(.a/.lib)和动态库(.dll/.so/.tbd/.dylib)。
除了以上几种,Mac OS/iOS 平台还可以使用 Framework
。
Framework 实际上是一种苹果特有的打包方式,例如.a这种静态库就是一个纯粹的二进制文件,而Framework则是将库的二进制文件,头文件和有关的资源文件打包到一起的产物,这样方便管理和分发,而.a则还需要头文件和资源文件的配合。大致理解成下面这种关系:
.a二进制文件 + .h头文件 + resource资源文件 = Framework
需要注意的是:苹果系统提供的framework是运行在系统中的,而开发者使用Cocoa Touch Framework
方式创建的framework则存放在app的bundle
目录下,运行在沙盒里,也就是说:不同程序之间,不共享代码。
二、动态库与静态库的区别
静态库和动态库的区别主要在于链接link
方式。
静态库:
静态库在编译的时候会被直接拷贝一份,复制到目标程序(可执行文件)里,这段代码在目标程序里就不会再改变了。
优点: 静态库的好处很明显,编译完成之后,库文件实际上就没有作用了。目标程序没有外部依赖,直接就可以运行。
缺点: 会重复拷贝多份,导致目标应用程序体积增大;还有一个缺点就是多个静态库文件名以及静态变量名不能重复,不然编译会报错或者找错
动态库:
不同于静态库,动态库在编译时并不会被拷贝到目标程序中,目标程序中只会存储指向动态库的引用。等到程序运行时,动态库才会被真正加载进来。
优点:动态库不需要拷贝到目标程序中,不会影响目标程序的体积,而且同一份库可以被多个程序使用,由于动态库是程序运行时才会载入的特性,可以让我们随时对库进行替换,而不需要重新编译代码
缺点:运行时加载会损失一部分性能,而且依赖外部环境,环境配置不支持这个版本的动态库会导致程序无法运行或者报错
三、使用库的场景:
库本身的优势:库是已经编译好的二进制了,编译的时候只需要 Link 一下,不会浪费编译时间。
使用库的场景:
1、我们需要提供代码给别人使用,但是不想让别人看到我们的源码,我们就可以只暴露头文件,把代码封装在库里面。
2、基本不怎么改动的代码,我们想减少项目的编译时间,我们可以把它打包成库(项目优化)