打赏

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`。
posted @ 2020-02-26 12:23  _Return  阅读(...)  评论(...编辑  收藏