动态链接库与静态链接库的区别
库文件的概念
库文件是计算机上的一类文件,提供给使用者一些开箱即用的变量、函数或类。库文件分为静态库和动态库,静态库和动态库的区别体现在程序的链接阶段:静态库在程序的链接阶段被复制到了程序中;动态库在链接阶段没有被复制到程序中,而是程序在运行时由系统动态加载到内存中供程序调用。使用动态库系统只需载入一次,不同的程序可以得到内存中相同的动态库的副本,因此节省了很多内存,而且使用动态库也便于模块化更新程序。
本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。库有两种:静态库(.a、.lib)和动态库(.so、.dll)。所谓静态、动态是指链接
讲一个程序编译为可执行程序的步骤如下图
静态链接库
静态库在链接阶段,会将汇编生成的目标文件.o与引用到的库一起链接打包到可执行文件中。因此对应的链接方式称为静态链接。静态库与汇编生成的目标文件一起链接为可执行文件,那么静态库必定跟.o文件格式相似。其实一个静态库可以简单看成是一组目标文件(.o/.obj文件)的集合,即很多目标文件经过压缩打包后形成的一个文件。
静态库特点总结
1:静态库对函数库的链接是放在编译时期完成的。
2:程序在运行时与函数库再无瓜葛,移植方便。
3:浪费空间和资源,因为所有相关的目标文件与牵涉到的函数库被链接合成一个可执行文件。
动态链接库
通过上面的介绍发现静态库,容易使用和理解,也达到了代码复用的目的,那为什么还需要动态库呢?
为什么还需要动态库?
为什么需要动态库,其实也是静态库的特点导致。
空间浪费是静态库的一个问题。
另一个问题是静态库对程序的更新、部署和发布页会带来麻烦。如果静态库liba.lib更新了,所以使用它的应用程序都需要重新编译、发布给用户(对于玩家来说,可能是一个很小的改动,却导致整个程序重新下载,全量更新)。
动态库在程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入。不同的应用程序如果调用相同的库,那么在内存里只需要有一份该共享库的实例,规避了空间浪费问题。动态库在程序运行是才被载入,也解决了静态库对程序的更新、部署和发布页会带来麻烦。用户只需要更新动态库即可,增量更新。
静态库与动态库的区别
1.命名方式不同:
静态库libxxx.a:库名前加”lib”,后缀用”.a”,“xxx”为静态库名。
动态库libxxx.so:库名前加”lib”,后缀变为“.so”。
2.链接时间不同:
静态库的代码是在编译过程中被载入程序中。
动态库的代码是当程序运行到相关函数才调用动态库的相应函数
3.链接方式不同:
静态库的链接是将整个函数库的所有数据在编译时都整合进了目标代码。
动态库的链接是程序执行到哪个函数链接哪个函数的库。(用哪个链接哪个)
静态库与动态库的优缺点
静态库:
优点是:在编译后的执行程序不再需要外部的函数库支持,运行速度相对快些;
缺点是:如果所使用的静态库发生更新改变,你的程序必须重新编译。
动态库 :
优点是:动态库的改变并不影响你的程序,所以动态函数库升级比较方便;
缺点是:因为函数库并没有整合进程序,所以程序的运行环境必须提供相应的库。