一. DLL的创建
1. 创建环境
VS2022(注:其他VS大同小异)
2. 创建过程
新建My_Dll项目
点击确定 —>下一步—>输入DLL工程的名称My_Dll—>创建。
3. 创建可能碰到的问题
点击完成后编辑DLL工程,之后编译,发现Debug文件下没有.lib和.exp文件
解决方法:
右键工程头文件->添加->新建项->模块定义文件(.def)->输入任意名称->添加,之后重新编译就可以了。
原因:
没有给工程添加def链接。vs一般会自动给工程添加def链接,如果没自动添加,就手动添加即可。添加方法:项目属性->链接器->输入->模块定义文件->在里面添上*.def
4. 创建成功的标志
打开程序所在文件路径的Debug下可看到如下图所示的五个文件
二. DLL内容编写
头文件:test.h
#pragma once
#include <iostream>
//! 其他头文件
...
#ifdef MYDLL_EXPORTS
#define DLL_TEST_API__declspec(dllexport)
#else
#define DLL_TEST_API__declspec(dllimport)
#endif
//! 导出函数声明
DLL_TEST_API void test();
//! 导出类声明
class DLL_TEST_API CMyTest
{
public:
void function();
...... //<成员方法
private:
...... //<成员变量
};
源文件:test.cpp
#include"test.h"
//! 函数定义
DLL_TEST_API void test()
{
//! ...具体实现...
std::cout << "函数调用" << std::endl;
}
//! 类定义
void CMyTest::function()
{
//! ...具体实现...
std::cout << "类方法调用" << std::endl;
}
三. DLL调用
-
在此解决方案下添加—>新建项,添加新的TEST_DLL工程。
-
右键TEST_DLL工程—>属性—>C/C++
-
右键TEST_DLL工程—>属性—>链接器
-
右键TEST_DLL工程—>属性—>链接器
-
TEST_DLL工程添加源文件main.cpp,然后编写相应的调用DLL逻辑即可。
#include"test.h" int main() { test(); CMyTest tmp; tmp.function(); system("pause"); return 0; }
编译运行之后可看到DLL的调用效果,即可得到如下俩行打印:
函数调用 类方法调用
注意:
如果编译报错:error LNK2019: 无法解析的外部符号 ,则在main.cpp中添加代码#include"test.cpp"即可
该报错原因:类模板的定义和声明都应该放在头文件中,因为如果放在源文件,无法将成员函数实例化
四.dll编写时宏的解释
如上文dll编写时的宏:
#ifdef TEST_EXPORTS
#define DLL_TEST_API __declspec(dllexport)
#else
#define DLL_TEST_API __declspec(dllimport)
#endif
**TEST_EXPORTS:**在新建DLL工程时,编译器会在工程的 —> 属性 —> C/C++ —> 命令行 —> 所有选项,加入/D “TEST_EXPORTS”,这个名称根据dll的名称而改变。
目的是在该项目上下文定义一个名为“DLL_EXPORTS”的宏定义, 相当于在上述宏的前边加了
#define TEST_EXPORTS
dllexport表示:符号DLL_TEST_API是从本DLL导出的符号(函数或类)
dllimport表示:符号DLL_TEST_API是从别的DLL导入的符号