1.静态链接库LIB和动态链接库DLL的区别
若采用静态链接库,lib 中的指令都全部被直接包含在最终生成的 EXE 文件中了。而动态动态链接库则不必被包含在最终 EXE 文件中,EXE 文件执行时可以“动态”地引用和卸载这个与 EXE 独立的 DLL 文件。另一个区别是静态链接库中不能再包含其他的动态链接库或者静态库,而动态链接库中还可以再包含其他的动态或静态链接库。
lib | dll | |
与exe关系 | lib全部被包含在最终exe中 | 不必包含在最终exe中,动态引用和卸载dll |
和其他库关系 | 不能再包含其他dll或lib | 还可以再包含别的dll或lib |
2.h头文件 .lib库文件 .dll动态链接库文件关系
.h头文件是编译时必须的,lib是链接时需要的,dll是运行时需要的。
附加依赖项添加的是.lib而不是.dll,若生成了DLL,则肯定也生成了LIB文件。
H文件的作用:声明函数接口
DLL文件作用:函数可执行代码
LIB文件作用:当我们在自己的程序中引用了一个H文件里的函数,链接器怎么知道该调用哪个DLL文件呢?这就是LIB文件的作用了(在链接过程中,只是把这些信息给到exe,并没有把函数实现代码添加到exe中)。它告诉链接器调用的函数在哪个DLL中,函数执行代码在DLL中的什么位置,这也就是为什么需要附加依赖项.LIB文件,它起到桥梁的作用。
如果是生成静态库文件,则没有DLL,只有lib,这时函数可执行代码部分也在lib文件中。
目前以lib后缀的库有两种,一种为静态链接库(Static Libary,以下简称“静态库”),另一种为动态连接库(DLL,以下简称“动态库”)的导入库(Import Libary,以下简称“导入库”)。
3. 为什么需要动态库?
- 空间浪费是静态库的一个问题。
- 另一个问题是静态库对程序的更新、部署带来麻烦。如果静态库liba.lib更新了,所有使用它的应用程序都需要重新编译、发布给用户(对于玩家来说,可能是一个很小的改动,却导致整个程序重新下载,全量更新)。
- 动态库在程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入。不同的应用程序如果调用相同的库,那么在内存里只需要有一份该共享库的实例,规避了空间浪费问题。动态库在程序运行时才会载入,也解决了静态库对程序的更新、部署带来麻烦(我的注:某个dll更新了,其他的不需要重新编译,所以用户只是替换下dll文件而已)。用户只需要更新动态库即可,增量更新。
参考文章:
1.https://blog.csdn.net/Young__Fan/article/details/80528740
2.https://www.cnblogs.com/zqh20145320/p/6772985.html
3.https://blog.csdn.net/wcc27857285/article/details/84615891