使用DEF导出一个类
- 创建一个
DLL
项目,并删除所有默认生成的文件,且关闭预编译头选项(配置属性->C/C++
->预编译头->不使用预编译头)。 - 配置使用最新的
C++
标准,并且打开配置属性-> C/C++ ->语言->启用实验性的C++标准库模块
,以及同路径中的生成ISO C++23标准库模块
- 创建三个文件:
Module.ixx
、Module.cpp
、Source.def
。
向文件中填写内容:
export module Module;
export class ModuleClass {public: ModuleClass(); ModuleClass(int); void MyFunc();private: void MyFunc(int);
public: int m_value = 1001; static int s_value;};
export int ModuleClass::s_value = 2002;
export ModuleClass* __stdcall CreateModuleClass();
export ModuleClass* __stdcall CreateModuleClass(int value);
module Module;import std;
void __thiscall ModuleClass::MyFunc() { std::cout << "ModuleClass::MyFunc() called" << std::endl;}
void __thiscall ModuleClass::MyFunc(int) { std::cout << "ModuleClass::MyFunc(int) called" << std::endl;}
ModuleClass::ModuleClass(int value){ m_value = value; std::cout << "ModuleClass::ModuleClass(int) called" << std::endl;}
ModuleClass::ModuleClass() { std::cout << "ModuleClass::ModuleClass() called" << std::endl;}
ModuleClass* __stdcall CreateModuleClass() { return new ModuleClass();}
ModuleClass* __stdcall CreateModuleClass(int value) { return new ModuleClass(value);}
LIBRARYEXPORTS ModuleClass_MyFunc=?MyFunc@ModuleClass@@QAEXXZ ModuleClass_MyFunc_Int=?MyFunc@ModuleClass@@AAEXH@Z ICreateModuleClassWithInt=??0ModuleClass@@QAE@H@Z ICreateModuleClass=??0ModuleClass@@QAE@XZ ModuleClass_s_value=?s_value@ModuleClass@@2HA DATA
CreateModuleClassWithInt=?CreateModuleClass@@YGPAVModuleClass@@H@Z CreateModuleClass=?CreateModuleClass@@YGPAVModuleClass@@XZ
其中,Source.def
文件编写要注意两点:
- 导出成员函数、函数重载时要注意,只能写被名称修饰后的名称,不能够写原始名称。
