Qt创建dll,使用QLibrary类方式调用dll
一、创建项目
1、新建项目->其他项目->Empty qmake Project->Choose
2、输入项目名,选择项目位置,下一步
3、选择MinGW,下一步
4、完成
5、.pro中添加TEMPLATE = subdirs,并构建项目
二、生成dll
1、右击项目,选择新子项目
2、Library->C++库->Choose
3、输入子项目名->下一步
4、下一步
5、完成
8、librarydll.h中声明两个函数,一个可被调用的加法函数,一个不可被调用的减法函数
#ifndef LIBRARYDLL_H
#define LIBRARYDLL_H
#include "librarydll_global.h"
//extern "C" ADDDLLSHARED_EXPORT:使MyAdd函数能被其他程序通过dll调用
extern "C" LIBRARYDLLSHARED_EXPORT int MyAdd(int a, int b);
class LIBRARYDLLSHARED_EXPORT LibraryDll
{
public:
LibraryDll();
//MySub函数不能被其他程序通过dll调用
int MySub(int a, int b);
};
#endif // LIBRARYDLL_H
9、librarydll.cpp中对函数进行定义
#include "librarydll.h"
LibraryDll::LibraryDll()
{
}
int LibraryDll::MySub(int a, int b)
{
return (a - b);
}
int MyAdd(int a, int b)
{
return(a + b);
}
10、构建LibraryDll项目,在debug文件夹下生成dll
三、使用dll
1、右击项目,选择新子项目
2、Application->Qt Widgets Application->Choose
3、输入子项目名,下一步
4、下一步
5、完成
6、mainwindow.ui中进行界面设计
7、mainwindow.h添加代码
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QLibrary>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = nullptr);
~MainWindow();
private slots:
void on_addButton_clicked();
void on_subButton_clicked();
private:
Ui::MainWindow *ui;
QLibrary m_lib;
};
#endif // MAINWINDOW_H
8、mainwindow.cpp添加代码
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
//QString str("E:/1.SWS/3.Demo/build-QLibraryDemo-Desktop_Qt_5_12_0_MinGW_64_bit- Debug/LibraryDll/debug/LibraryDll.dll" );
QString str("../LibraryDll/debug/LibraryDll.dll" );
m_lib.setFileName(str);
//动态加载库
if(!m_lib.load())
{
qDebug() << "load failed:" << m_lib.errorString() ;
}
}
MainWindow::~MainWindow()
{
//检查是否加载成功
if(m_lib.isLoaded())
{
//卸载库
m_lib.unload();
}
delete ui;
}
void MainWindow::on_addButton_clicked()
{
//定义函数指针
typedef int(*AddFunction)(int a,int b);
//解析库中的符号
//AddFunction Add = (AddFunction)lib.resolve("MyAdd");
AddFunction Add = reinterpret_cast<AddFunction>(m_lib.resolve("MyAdd"));
if (!Add)
{
qDebug() << "resolve failed:" << m_lib.errorString() ;
}
else
{
int num1 = ui->num1Edit->text().toInt();
int num2 = ui->num2Edit->text().toInt();
int ret = Add(num1, num2);
ui->retEdit->setText(QString::number(ret));
}
}
void MainWindow::on_subButton_clicked()
{
//定义函数指针
typedef int(*SubFunction)(int a,int b);
//解析库中的符号
SubFunction Sub = reinterpret_cast<SubFunction>(m_lib.resolve("MySub"));
if (!Sub)
{
qDebug() << "resolve failed:" << m_lib.errorString() ;
}
else
{
int num1 = ui->num1Edit->text().toInt();
int num2 = ui->num2Edit->text().toInt();
int ret = Sub(num1, num2);
ui->retEdit->setText(QString::number(ret));
}
}
9、运行LibraryUse项目
输入数1、数2,点击“加法”按键
点击“减法”按键,会输出
resolve failed: "Cannot resolve symbol \"MySub\" in ..\\LibraryDll\\debug\\LibraryDll.dll: 找不到指定的程序。"
原因:MySub函数没有添加extern "C" LIBRARYDLLSHARED_EXPORT声明,不可被调用