什么是库?
库是写好的,现有的,成熟的,可以复用的代码。
现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都是从0开始。
本质上说,库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。
库有两种:静态库(.a、.lib) 和 动态库(.so、.dll)
这里所谓的静态、动态是指链接过程的动态和静态。
将一个程序编译成可执行程序的步骤如下:
图:编译过程
静态库
之所以称为 静态库,是因为子啊链接阶段,会将汇编生成的目标文件.o与引用到的库一起链接打包到可执行文件中,。
因此对应的链接方式称为静态链接。
试想一下,静态库与汇编生成的目标文件一起链接为可执行文件,那么静态库必定跟.o文件格式相似。其实
一个静态库可以简单看成是一组目标文件(.o/.obj文件)的集合,即很多目标文件经过压缩打包后形成的一个文件。
静态库特点总结:
1.静态库对函数库的链接是放在编译时期完成的
2.程序在运行时与函数库再无关系,移植方便
3.浪费空间和资源,因为所有相关的目标文件与牵扯到的函数库被链接合成一个可执行文件
动态库
为什么需要动态库,其实也是静态库的特点所导致的
1.空间浪费是静态库的一个大问题
2.静态库对程序的更新、部署和发布也会带来麻烦。如果静态库lib a.lib更新了,所有使用它的应用程序都需要
重新编译、发布。全量更新
动态库在程序编译时并不会被连接到目标代码中,而是在程序运行时才被载入。不同的应用程序如果调用相同的库
,那么在内存中只需要有一份该共享库的实例,规避了空间浪费问题。
动态库的特点总结:
1.动态库把对一些库函数的连接 载入 推迟到 程序运行的时期
2.可以实现进程之间的资源共享
3.将使一些程序升级变得简单
4.甚至可以真正做到连接载入完成由程序员在程序代码中控制(显示调用)
总结:
二者的不同点在于代码被载入的时刻不同
1.静态库在程序编译时会被链接到目标代码中,程序运行时将不再需要该静态库,因此体积较大,但是代码装载速度快,执行速度比动态库快
2.动态库在程序编译时并不会被链接到目标代码中,而是在程序运行时才被载入,因此在程序运行时
还需要动态库存在,因此代码体积较小。
动态库的好处时,不同的应用程序如果调用相同的库,那么内存里只要有一份该共享库的实例。
但是缺点就是 如何规避动态库管理问题。