MinGW dll导入导出类
dll不仅可以导入导出函数,还可以导入导出类。这篇文章就来介绍如何将类导入dll中并导出。
首先我们建立一个名为dll.cpp的文件(又是这种破名字),里面写上:
#include <iostream>
using namespace std;
#define EXPORT __declspec(dllexport)
extern "C"{
class EXPORT CLASS; //要导入的类
}
class CLASS{ //类的主体
public:
int a,b;
int A_B(); //成员函数,注意函数的内容不能直接写在这里面,需要在类外面定义
};
//CLASS的成员函数
int CLASS::A_B(){ return a+b; }
现在来把这个代码编译,打开cmd,输入命令 `g++ -c dll.cpp -o dll.o -DBUILDING_DLL=1` ,接着输入 `g++ -shared dll.o -o dll.dll -Wl,--output-def,dll.def,--out-implib,dll.a,--add-stdcall-alias` 来把dll.o编译为dll.dll。
接下来我们新建一个名为test.cpp的文件,里面写上:
#include <iostream>
using namespace std;
#define EXPORT __declspec(dllimport)
extern "C"{
class EXPORT CLASS; //要导入的类
}
class CLASS{ //类的主体
public:
int a,b;
int A_B();
};
int main(){
CLASS m;
m.a=m.b=10;
cout << m.A_B();
return 0;
}
输入 g++ -ldll test.cpp -o test.exe
来把刚刚的test.exe编译,同时导入dll.dll。
运行结果:
20
题外话:编译时提示找不到-ldll的解决方案
部分童鞋在编译上面的代码会出现can't find -ldll的情况,出现这种情况的原因是因为你的dll没有和test.cpp放在一起(假设你的cmd目录已经cd到test.cpp的目录里面了),这种情况下把dll.dll放在test.cpp的目录下就能编译成功,或者将编译命令改为 `g++ -L dll的目录 -ldll test.cpp -o test.exe`。