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

Qt创建dll,使用QLibrary类方式调用dll

一、创建项目

1、新建项目->其他项目->Empty qmake Project->Choose

13、Qt生成dll-QLibrary方式使用_第1张图片

 2、输入项目名,选择项目位置,下一步

13、Qt生成dll-QLibrary方式使用_第2张图片

3、选择MinGW,下一步

13、Qt生成dll-QLibrary方式使用_第3张图片

 4、完成

13、Qt生成dll-QLibrary方式使用_第4张图片

 5、.pro中添加TEMPLATE = subdirs,并构建项目

13、Qt生成dll-QLibrary方式使用_第5张图片

 

二、生成dll

1、右击项目,选择新子项目

13、Qt生成dll-QLibrary方式使用_第6张图片

2、Library->C++库->Choose

13、Qt生成dll-QLibrary方式使用_第7张图片

3、输入子项目名->下一步

13、Qt生成dll-QLibrary方式使用_第8张图片

4、下一步

 

13、Qt生成dll-QLibrary方式使用_第9张图片

5、完成

13、Qt生成dll-QLibrary方式使用_第10张图片

 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

13、Qt生成dll-QLibrary方式使用_第11张图片

 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);
}

13、Qt生成dll-QLibrary方式使用_第12张图片

10、构建LibraryDll项目,在debug文件夹下生成dll

13、Qt生成dll-QLibrary方式使用_第13张图片

三、使用dll

1、右击项目,选择新子项目

13、Qt生成dll-QLibrary方式使用_第14张图片

2、Application->Qt Widgets Application->Choose

13、Qt生成dll-QLibrary方式使用_第15张图片

 3、输入子项目名,下一步

13、Qt生成dll-QLibrary方式使用_第16张图片

 4、下一步

13、Qt生成dll-QLibrary方式使用_第17张图片

 5、完成

13、Qt生成dll-QLibrary方式使用_第18张图片

 6、mainwindow.ui中进行界面设计

13、Qt生成dll-QLibrary方式使用_第19张图片

 7、mainwindow.h添加代码

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include 
#include 

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

13、Qt生成dll-QLibrary方式使用_第20张图片

 8、mainwindow.cpp添加代码

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include 

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(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(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,点击“加法”按键

13、Qt生成dll-QLibrary方式使用_第21张图片

 点击“减法”按键,会输出

resolve failed: "Cannot resolve symbol \"MySub\" in ..\\LibraryDll\\debug\\LibraryDll.dll: 找不到指定的程序。"

原因:MySub函数没有添加extern "C" LIBRARYDLLSHARED_EXPORT声明,不可被调用

你可能感兴趣的:(Qt小功能-Windows,qt,开发语言)