Qt:创建动态链接库总结(Qt5,dll)

1、DLL:创建一个dll项目

Qt:创建动态链接库总结(Qt5,dll)_第1张图片

Qt:创建动态链接库总结(Qt5,dll)_第2张图片

Qt:创建动态链接库总结(Qt5,dll)_第3张图片

一直点击下一步,直到创建完成。

2、DLL:dll项目有什么不同之处?

#ifndef SLD_H
#define SLD_H

#include "sld_global.h"
#include 

class SLDSHARED_EXPORT Sld
{

public:
    Sld();
    QString GetStr();
};

#endif // SLD_H

看一下项目默认头文件sld.h的不同之处,发现在类名Sld前面添加了一个SLDSHARED_EXPORT的关键字,表示此类用于导出到DLL

在这里添加了一个GetStr方法。

下面是sld.cpp文件代码:

#include "sld.h"


Sld::Sld()
{
    qDebug()<<"call sld constructor";
}
QString Sld::GetStr()
{
    return "aa";
}

我们发现此类是简单类,没有继承于任何对象。下面我们创建一个基于界面控件的类,看是否行得通。

3、DLL:创建一个界面类MyDialog

如图这样创建一个对话框类,创建方式与普通工程类似:

Qt:创建动态链接库总结(Qt5,dll)_第4张图片

我们发现新创建的类跟普通工程的类是一模一样的,为了能实现导出到DLL功能,我们要对mydialog.h做如下修改:

#ifndef MYDIALOG_H
#define MYDIALOG_H

#include 
#include "sld_global.h"

namespace Ui {
class MyDialog;
}

// 这里增加了SLDSHARED_EXPORT
class SLDSHARED_EXPORT MyDialog : public QDialog
{
    Q_OBJECT

public:
    explicit MyDialog(QWidget *parent = 0);
    ~MyDialog();

private:
    Ui::MyDialog *ui;
};

#endif // MYDIALOG_H

这里改动的只是增加一个SLDSHARED限定在类名前面,而cpp文件则无需改动:

#include "mydialog.h"
#include "ui_mydialog.h"

MyDialog::MyDialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::MyDialog)
{
    ui->setupUi(this);
}

MyDialog::~MyDialog()
{
    delete ui;
}

另外在ui界面拖入一个label,并写上文字标明此界面为来自dll的界面:

Qt:创建动态链接库总结(Qt5,dll)_第5张图片

至此,测试的dll项目已经创建完成,发现编译不会通过,找不到QDialog,我们需要在.pro里面增加

QT      +=widgets

另外,为了测试方便(把dll和调用方的输出exe放到同一个文件夹里),把路径改为新的地址而不是用默认地址,要在.pro文件增加:

#指定输出路径
DESTDIR =..\MyDebug

然后在项目里面去掉勾选输出路径:

Qt:创建动态链接库总结(Qt5,dll)_第6张图片


4、DLL:用构建而非运行

不要用run,而要用构建,对项目右键点击构建:

Qt:创建动态链接库总结(Qt5,dll)_第7张图片

构建完成即可看到在指定目录下已经生成sld.dll文件

5、调用:创建调用方测试项目

创建一个普通的桌面应用项目

6、调用:配置dll调用相关

#指定输出路径
DESTDIR =..\MyDebug

#把sld的项目文件夹包含到这里,这样就可以直接用里面的头文件
#在这里我把头文件单独拷贝到另一个文件夹,已证明并不需要cpp文件
INCLUDEPATH +=../sldHead
#添加dll
LIBS += ..\MyDebug\sld.dll

7、调用:增加一个按钮触发调用dll里的类

在按钮的槽里面增加以下代码:

void MainWindow::on_pushButton_clicked()
{
    // 测试dll中的MyDialog类
    MyDialog * my = new MyDialog(this);
    my->show();

    // 测试dll中的Sld类
    Sld s;
    QMessageBox * msg = new QMessageBox(this);
    msg->setText(s.GetStr());
    msg->show();
}

8、调用:查看效果

可以看到,dll内不管是ui还是普通的类都可以正常调用,就像在本程序里面一样

Qt:创建动态链接库总结(Qt5,dll)_第8张图片


9、调用:项目结构

注意:当所有.h包含进来并编译之后,项目只剩下dll文件和exe文件,并不需要.h文件了。把文件夹内的exe和dll一起拷贝到任何地方都能运行。


本文参考了这篇文章,在此表示感谢:http://blog.csdn.net/cateatapple/article/details/51004780


你可能感兴趣的:(qt)