动态链接是相对于静态链接而言的。所谓静态链接是指把要调用的函数或者过程链接到可执行文件中,成为可执行文件的一部分。换句话说,函数和过程的代码就在程序的exe文件中,该文件包含了运行时所需的全部代码。当多个程序都调用相同函数时,内存中就会存在这个函数的多个拷贝,这样就浪费了宝贵的内存资源。而动态链接所调用的函数代码并没有被拷贝到应用程序的可执行文件中去,而是仅仅在其中加入了所调用函数的描述信息(往往是一些重定位信息)。仅当应用程序被装入内存开始运行时,在Windows的管理下,才在应用程序与相应的DLL之间建立链接关系。当要执行所调用DLL中的函数时,根据链接产生的重定位信息,Windows才转去执行DLL中相应的函数代码。
Lib称为静态链接库(static link library),是在编译的链接期间使用的,他里面其实就是源文件的函数实现。
Dll称为动态链接库(Dynamic link library),是在程序运行时动态调用的,runtime时使用,它里面包含了源文件的函数实现、DllMain入口函数和.def文件。
那么也就是说,如果静态库里的代码有改动,所有依赖它的文件都要重新编译;动态库不用(某些更改)。
以上参考:https://blog.csdn.net/biggbang/article/details/44653705
总结以上就是说,静态库是在编译的时候链接的,并且多次调用就会多份拷贝,占的内存就会变大;动态库在运行时调用,多个模块调用内存中也只存一份
那为什么要用这些库呢?
其实可以直接把函数放在工程里进行调用,工程里引入这些库也是在调用其中的函数,但链接库就相当于把这部分给封起来了,可以避免源码泄露保密性更好。
参考链接:
【手把手教你编写 年轻人的第一个动态链接库-哔哩哔哩】
【【C++】静态库和动态库-哔哩哔哩】这两个讲的都很清楚
注意动态库里也有lib,但它并不是静态库的意思,其中也不包含定义的函数代码,它只是给链接器提供信息的文件(也叫导入库)
创建步骤见下图注释,注意配置时是release/debug 是x64还是啥在生成时一定要对应(就是运行旁边的那个可选处)
以下配置均基于visual studio2022
有如下两种形式,推荐第二种
1、在工程中的主函数cpp中直接如下引用
#include"xxx.h"//头文件中给出了lib库中的函数声明
#pragma comment(lib,‘‘D:\XX\xxx.lib’’)//引入lib库
2、在工程的属性页,
配置属性->C/C++ 的附加包含目录中加入头文件的路径(.h文件存在哪)
链接器->常规->附加库目录 加入lib文件所在路径
链接器->输入->附加依赖项 加入lib库的名字
动态库的.h和.lib文件和上面一样,.dll文件不用另外配置,只需要把它放在和编译后生成的exe文件一个目录下就可以运行(这里是工程下的debug目录下)。然后在双击exe文件就可以了,这样结果会一闪而过,可以用cmd切换到exe的路径后直接输入xx.exe就会有运行结果。
遗留问题:vscode中怎样生成链接库
只有dll一个文件时如何调用