最近学习了一下VS下DLL的生成和使用,在这里记录一下
首先创建一个win32的控制台工程,然后如图
创建好工程后我们可以看到在项目的 "属性->配置属性->常规" 里看到配置类型为动态库.dll (这个配置类型你也可以不在上一步的时候设置成DLL,进来之后再改)
一般是使用DLL文件需要.h .dll .lib
.h:函数的声明,变量的声明,自己去编写
.dll:由编译器生成
.lib:由编译器生成,这里动态库生成的lib一般管它叫“导入库”,这样的lib在大多数情况下要比静态库的lib小,里面不包含涉及到的函数的具体代码,里面只包含“这个函数在什么dll里面叫什么名字”这样的信息
接下来创建头文件和cpp文件,内容如下:
头文件内容如下:
__declspec(dllexport) void showHelloWorld();
__declspec(dllexport) int num = 7;
__declspec(dllexport)表示导出符号,加了这个关键字对应的函数和变量才能供调用DLL的人使用
cpp文件内容如下:
#include "helloWorld.h"
#include "stdio.h"
void showHelloWorld()
{
printf("Hello World!\n");
}
然后我们生成,可以在工程目录下找到对应的lib,dll
我的工程名字是dllTest,所以生成的就是dllTest.lib和dllTest.dll
到这里DLL的生成就完成了。
先说一下头文件的问题吧,我们可以直接把上面生成DLL文件时候写的头文件直接拿来用,不过这样不太好,问题出在__declspec(dllexport)这个关键字,这里我们要用到另一个关键字为__declspec(dllimport)导入,使用这个关键字可以提高编译器的效率(感兴趣的可以具体了解一下,楼主还不是很理解里面的原理)
对于使用导入的函数:可以使用__declspec(dllexport)和__declspec(dllimport)或者不使用关键字
但是使用导入的变量:必须使用__declspec(dllimport)
所以我们还是都使用__declspec(dllimport)比较省心
头文件的内容如下:
__declspec(dllimport) void __stdcall showHelloWorld();
__declspec(dllimport) int num;
cpp的内容如下:
#include "useDll.h"
#include "stdio.h"
#pragma comment(lib, "dllTest.lib")
int main()
{
showHelloWorld();
printf("num = %d\n", num);
}
运行结果如下:
撒花庆祝✿✿ヽ(°▽°)ノ✿
补充两点
1********************************************************************************************
cpp文件中使用了#pragma comment(lib, "dllTest.lib")
如果不想写这个,可以在项目里配置一下,如下
2********************************************************************************************
一般提供DLL的时候要提供头文件,所以我们可以通过宏定义让一份头文件同时满足提供者和使用者,如下:
#ifdef DLLTEST_EXPORTS
#define DLLTEST_API __declspec(dllexport)
#else
#define DLLTEST_API __declspec(dllimport)
#endif
DLLTEST_API void __stdcall showHelloWorld();
DLLTEST_API int num = 7;
你会发现当你的工程输出为DLL的时候VS已经给你定义了DLLTEST_EXPORTS这个宏
好的, 下面没有了,有错误地方希望大家指出。