C10—Qt制作C++动态链接库2022-03-03

  • Post author:
  • Post category:其他

Qt制作C++动态链接库

1.创建DLL工程文件creatMyDll

①创建C++ Library应用
在这里插入图片描述
②qt module处选择core才能使用qt的内容,如果选择none则不能使用。例如,要使用qDebug类应该选择core。
在这里插入图片描述
③添加代码如下:
此处创建了private、protected、public下各一个函数,是想在此提醒一下这些关键字的作用。
creatmydll.h文件

#ifndef CREATMYDLL_H
#define CREATMYDLL_H
#include "creatMyDll_global.h"
#include <QDebug>
class CREATMYDLL_EXPORT CreatMyDll
{
public:
    CreatMyDll();
    QString showStatus();
private:
    int testPrivate(int,int);
protected:
    int testProtected(int, int);
};
#endif // CREATMYDLL_H

creatMyDll_global.h没有改动,保持默认。
creatmydll.cpp文件如下

#include "creatmydll.h"
CreatMyDll::CreatMyDll()
{
}
QString CreatMyDll::showStatus()
{
    QString str = "Dll Creat Success!";
    qDebug()<<str;
    return str;
}

int CreatMyDll::testPrivate(int v1, int v2)
{
    return v1+v2;
}

int CreatMyDll::testProtected(int a1, int a2)
{
    return a1-a2;
}

④Run代码,在影子构建的debug下将看到生成了dll、.o、.a文件,这就是我们要的动态链接库文件。
在这里插入图片描述

2.调用DLL文件工程callMyDll

①copy .h文件 到callMyDll工程的根目录
在这里插入图片描述
②在qt工程中添加两个.h文件
在这里插入图片描述
选择刚才那两个.h文件
③在callMyDll工程下,复制生成.a文件到callMyDll工程根目录,并为他们创建一个文件夹叫“include”
在这里插入图片描述
在这里插入图片描述
④为callMyDll添加动态链接库
在这里插入图片描述
选择外部库,选择.a文件,其余选项按照截图设置
在这里插入图片描述
⑤复制dll文件到callMyDll工程的exe所在的文件夹,如还未生成,请先构建一遍,注意,此处应该使用release构建。
在这里插入图片描述
⑥添加代码如下:
callmydll.h文件

#ifndef CALLMYDLL_H
#define CALLMYDLL_H
#include <QWidget>
#include "creatmydll.h"
#include "creatMyDll_global.h"
QT_BEGIN_NAMESPACE
namespace Ui { class callMyDll; }
QT_END_NAMESPACE
class callMyDll : public QWidget
{
    Q_OBJECT
public:
    callMyDll(QWidget *parent = nullptr);
    ~callMyDll();
    CreatMyDll myDef;
private:
    Ui::callMyDll *ui;
    void Init();
};
#endif // CALLMYDLL_H

callmydll.cpp

#include "callmydll.h"
#include "ui_callmydll.h"

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

    Init();

}

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

void callMyDll::Init()
{
    ui->status_Edit->setText(myDef.showStatus());
//    int a = ui->valueOne->text().toInt();
//    int b = ui->valueTwo->text().toInt();
//    int c = myDef.testPrivate(a,b);//private下的函数,仅自己能调用
//    int d = myDef.testProtected(a,b);//protected下的函数仅派生类可用
//    ui->add->setText(QString::number(c));
//    ui->minus->setText(QString::number(d));
}

main文件

#include "callmydll.h"
#include <QApplication>
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    callMyDll w;
    w.show();
    return a.exec();
}

⑦运行程序,结果如图。
在这里插入图片描述