DLL 动态链接库的创建与使用
参考教程:
DLL动态链接库的创建与使用(实例教程) - ElaineTiger - 博客园 (cnblogs.com)
1. 什么是动态链接库
动态链接库是一个可以被其它应用程序共享的程序模块,其中封装了一些可以被共享的例程和资源。动态链接库文件名的扩展名一般是dll
,也有可能是drv
,sys
和fon
,它和可执行文件(exe
)非常类似,区别在于动态链接库中虽然包含了可执行代码却不能单独执行,而应由应用程序直接或间接调用。
-
理解
动态链接库可以理解为一个文件夹,在这个文件夹中我们可以放任何的程序,也可以在动态链接库中写多线程函数。
这就有点理解了,动态链接库的动态性就体现在了,它是在写入内存之后才完成了链接,并且会根据链接的重定位,在后续的运行过程中,跳转到需要运行的部分。
动态链接库是相对于静态链接而言的。
所谓静态链接是指把要调用的函数或者过程链接到可执行文件中,成为可执行文件的一部分。换句话说,函数和过程的代码就在程序的可执行文件中,该文件包含了运行时所需的全部代码。当多个程序都调用相同函数时,内存中就会存在这个函数的多个拷贝,这样就浪费了宝贵的内存资源。
而动态链接所调用的函数代码并没有被拷贝到应用程序的可执行文件中去,而是仅仅在其中加入了所调用函数的描述信息(往往是一些重定位信息)。仅当应用程序被装入内存开始运行时,在操作系统的管理下,才在应用程序与相应的动态链接库之间建立链接关系。当要执行所调用动态链接库中的函数时,根据连接产生的重定位信息,操作系统才转去执行动态链接库中相应的函数代码。
动态链接库的使用。当要执行所调用动态链接库中的函数时,根据连接产生的重定位信息,操作系统才转去执行动态链接库中相应的函数代码。
在 VS 中创建动态链接库一般都会生成.lib
文件和.dll
文件,在应用程序项目里使用动态链接库要添加.lib
文件,语令#pragma comment(lib,“xxx.lib”)
,这不是静态库的调用吗?其实这个文件记录了dll
中函数的入口地址,所以要像静态库中的.lib
文件一样,用同样的方式加到我们的项目里,添加好后直接运行会得到错误:由于找不到xxx.dll
,无法执行代码。所以要添加.dll
文件,一定要放在项目的.exe
同一个路径下。
还有几个注意事项:
1、可以修改.lib
文件的文件名,只要在项目引用它时是它目前的名称,但不能改变.dll
的文件名,否则依旧会出现找不到.dll
文件的错误。
2、.dll
文件也要和应用程序的位数相对应,要么都是 64
位,要么都是 32
位,不可交叉使用,否则报错,应用程序无法正常启动。
2. 创建 DLL 项目
打开Visual Studio
,选择“创建新项目(N)
”
搜索“动态链接库(DLL)
”,选择“动态链接库(DLL)
”,点击“下一步
”:
设置项目名称“DLLdemo
”,保存位置为”D:\
”
即可打开如下图所示的项目界面:
创建头文件TestDLL.h
,它是作用是用来声明需要导出的函数接口,点击“头文件
”,右键,选择“添加
”,选择“新建项
”。
选择“头文件
”,输入名称“TestDLL.h
”,点击“添加
”
在TestDDLL.h
中添加示例代码:
#pragma once
extern "C" _declspec(dllexport) int Add(int a, int b);
- extern “C”:作用是告诉编译器代码按C语言的方式进行编译
- _declspec(dllexport):此修饰符告诉编译器和链接器被它修饰的函数或变量需要从
DLL
导出。与其相对的代码是_declspec(dllimport)
此修饰符告诉编译器和链接器被它修饰的函数或变量需要从DLL
导入。 - int Add(int a, int b):需要被其他程序调用的函数
创建源文件TestDLL.cpp
,它的作用是用来实现被声明的函数。
点击“源文件
”,右键,选择“添加
”,选择“新建项
”
选择“C++文件(.cpp)
”,修改名称为TestDLL.cpp
,点击”添加
”
在TestDDLL.cpp
中添加示例代码:
#include "pch.h"
#include "TestDLL.h"
int Add(int a, int b) {
return a + b;
}
3. 编译
点击”解决方案‘DLLdemo’
,右键,选择“生成解决方案(B)
”
会在该项目路径...\DLLdemo\x64\Debug
下生成一个DLLdemo.dll
文件
4. 调用动态链接库
打开Visual Studio
,选择“创建新项目(N)
”
选择“控制台应用
”,并点击“下一步
”
输入项目名称为TestDLL
,并将其安装在D
盘。
将D:\DLLdemo\x64\Debug
的DLLdemo.dll
和DLLdemo.lib
文件放到D:\TestDLL\TestDLL
文件夹下
将D:\DLLdemo\DLLdemo
文件夹下的TestDLL.h
文件放到D:\TestDLL\TestDLL
文件夹下
编写TestMain.cpp
,将TestMain.cpp
修改为如下内容:
#include "TestDLL.h"
#include <stdio.h>
#include <stdlib.h>
#pragma comment(lib, "Dlldemo.lib")
int main() {
int c = Add(5, 3);
printf("5+3=%d", c);
system("pause");
return 0;
}
点击“本地Windows 调试器
”
测试结果如下图所示:
将 D:\DLLdemo\x64\Debug
的 DLLdemo.dll
复制粘贴到 D:\TestDLL\x64\Debug
文件夹下
双击 TestDLL.exe
即可看到如下图所示的结果
-
测试:没有将DLLdemo.dll复制粘贴到 D:\TestDLL\x64\Debug 文件夹下
如果我们没有将
DLLdemo.dll
复制粘贴到D:\TestDLL\x64\Debug
文件夹下则双击
TestDLL.exe
,会显示“由于找不到DLLdemo.dll,无法继续执行代码。重新安装程序可能会解决此问题。
”