环境:WIN10, QT5.14.2, QT Creator5.14.1
制作DLL
打开Qt Creator,新建工程:
选择创建C++ Library
给项目命名为create_dll,项目创建在自己定义的目录下
之后一直点击Next ,直到选择MinGW编译
再点击Next,然后点击Finish完成创建,生成的目录结构如下:
首先,在create_dll.pro文件中指定生成的文件名:
TARGET = test
然后修改create_dll.h文件:
#ifndef CREATE_DLL_H
#define CREATE_DLL_H
#include "create_dll_global.h"
//此类为dll文件的主类
class CREATE_DLL_EXPORT Create_dll
{
public:
Create_dll();
//函数在这里作为虚函数定义,析构函数也尽量声明为虚析构函数
virtual int add(int a, int b);
virtual ~Create_dll();
};
//这个函数用来创建一个类的实例,返回类型必须是指针
extern "C" CREATE_DLL_EXPORT Create_dll* getDllObj();
//extern "C"指示编译器按照C语言的编译方式编译,防止链接错误
#endif // CREATE_DLL_H
接下来在create_dll.cpp中定义函数:
#include "create_dll.h"
//构造函数和析构函数
Create_dll::Create_dll() {}
Create_dll::~Create_dll() {}
//创建实例的函数,在类外定义函数,不需要重复添加关键字"virtual"和导入/导出类型CREATE_DLL_EXPORT
Create_dll *getDllObj()
{
return new Create_dll();
}
//定义要打包的函数
int Create_dll::add(int a, int b) {
return a + b;
}
在Qt Creator左下角选择编译方式:
点击编译按钮,会在同级目录下生成一个build目录
此目录中有2个文件夹:release和debug,我们的dll文件在release文件夹里。
使用DLL
再创建一个Qt项目,这里选择的是窗口应用程序:
一直点击Next,最后点击Finish完成创建,生成的目录结构如下:
将dll的头文件复制并添加进项目中:
HEADERS += \
create_dll.h \
create_dll_global.h \
点击mainwindow.ui打开设计界面,在界面上放置一个按钮,将其名称改为load_dll,并为其添加一个clicked信号的槽函数:
void MainWindow::on_pushButton_clicked()
{
QString str;
int sum;
QLibrary *lib = new QLibrary("test.dll");
if (lib->load()) {
Create_dll *dll = ((Create_dll* (*)())(lib->resolve("getDllObj")))();
sum = dll->add(1, 2);
str = QString("sum = %1").arg(sum);
QMessageBox::information(this, "result", str);
lib->unload();
delete lib;
delete dll;
}
}
构建项目,
将test.dll复制到构建目录的debug目录下:
运行项目