> 文章列表 > 13、Qt生成dll-QLibrary方式使用

13、Qt生成dll-QLibrary方式使用

13、Qt生成dll-QLibrary方式使用

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_OBJECTpublic: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声明,不可被调用