Qt如何使用lib库封装界面二(Qt5动态链接库创建和使用)

其实这三个链接的操作照着做就行啦,很简单,只有一个地方最关键:就是文件路径的配置。只有这个地方容易出错,其他的都不会有问题出现。上传的代码一定有用,只要你路径配置正确。欢迎下载



推荐学习链接是:

①https://blog.csdn.net/vample/article/details/78841945

动态链接库封装源码(第一条链接源码):

1、第一条里面需要注意的是当 我们在.pro文件里加上DESTDIR =Mydll,它的意思是我们把生成的内容放到这个文件夹里面,如果没有它会自动生成在sld工程文件之外,并且生成的文件夹是与sld文件夹处于平行位置,并且需要点击项目把Shadow build 去掉勾选,这样文件夹生成的内容会放到这个文件夹Mydll里面,并且这个文件夹将会自动产生,并且在sld工程文件夹里面。

2、在项目选项处去掉勾选项shadow build勾选,这个其实去不去掉都行啦,只要你们生成三个sld_global.h,sld.h和sld.dll文件即可。

3、在动态链接库中封装内部函数的方法就是先声明在sld.h文件QString GetStr();,后在sld.cpp文件里面定义函数

class SLDSHARED_EXPORT Sld
{
 
 
public:
    Sld();
 
 
    QString GetStr();//声明内部函数
};
 
 

QString Sld::GetStr()//定义内部函数
{
    return "aa";
}

在动态链接库中封装外部函数的方法就是在sld.h文件的Sld类的外面先声明

extern "C" SLDSHARED_EXPORT Q_DECL_EXPORT int add(int i, int j);
,后在sld.cpp文件Sld类的外面定义函数
int add(int i, int j)
{
    return i+j;
}

代码如下:

extern "C" SLDSHARED_EXPORT Q_DECL_EXPORT int add(int i, int j);//外部函数定义,必须加上extern声明
//外部函数
int add(int i, int j)
{
    return i+j;
}

②https://blog.csdn.net/vample/article/details/78850300

动态链接库隐式调用操作的源码(第二条链接源码):

怎么使用动态链接库(隐式调用)

新建一个Qt WidgetsApplication项目

点击项目不把shadow build勾选去掉 

在开始之前先分析一下dll在什么时候需要,我们写程序的时候两个地方需要,一个是编译的时候,一个是exe文件运行的时候,那么因此,我们需要在两份dll文件(只用一份请看方法二)。

首先,我们把dll相关的头文件拷贝出来,放到一个目录下,目录是随意的,然后用includepath来加载,这个没什么好说的,拷贝的文件是:sld_global和sld.h(总之你把dll相关的头文件都拷贝出来就行了),

这里我们把它放在/heads目录下,然后把sld.dll拷贝到/release目录下(运行时要用)

和sld

      VS编译的编译的动态链接库需要三个文件sld.h、sld.lib、sld.dll

在.pro文件里修改(MinGW)

 
  
INCLUDEPATH +=../MyDialog/heads
LIBS += ../MyDialog/release/sld.dll

 

第一句是把sld项目的文件夹包含到这个项目里来,这样我们就能直接用它里面的头文件sld_global和sld.h

第二句是告诉编译器lib在哪(我用的是vs的编译器如果 用mingw可以直接添加sld.dll)

       如果是lib则要指向lib目录

我样在窗体上加一个按钮,并添加槽

.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H
 
  
#include <QMainWindow>
 
  
namespace Ui {
class MainWindow;
}
 
  
class MainWindow : public QMainWindow
{
    Q_OBJECT
 
  
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
 
  
private slots:
    void on_pushButton_clicked();
 
  
private:
    Ui::MainWindow *ui;
};
 
  
#endif // MAINWINDOW_H
 
  
 
  

.CPP
 
  
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "sld.h"
#include <QMessageBox>
#include <QString>
 
  
 
  
 
  
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}
 
  
MainWindow::~MainWindow()
{
    delete ui;
}
 
  
void MainWindow::on_pushButton_clicked()
{
 
  
    Sld s;
 
  
    QMessageBox::information(this, tr("Inform;ation"),s.GetStr());
 
  
    //QMessageBox::information(this, tr("Information"),QString::number(add(5,6)));
}
 
  

好了,构建,运行看效果吧

总结,隐式调用就是:

一:在pro文件用LIBS给它指定一下dll文件在哪里,就是前面的两句就是了,这是需要.dll文件的第一个位置;     

二:在你的程序编译生成的文件夹里面的debug( 或者说含.exe文件的目录位置),放一个dll文件(这个是非常有必要加的,不加的话,程序就会挂掉)。

③https://blog.csdn.net/vample/article/details/78850369

动态链接库显示调用操作的源码:https://download.csdn.net/download/wise18146705004/10536646

动态链接库显式调用

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H
 
 
#include <QMainWindow>
 
 
namespace Ui {
class MainWindow;
}
 
 
class MainWindow : public QMainWindow
{
    Q_OBJECT
 
 
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
 
 
private slots:
    void on_pushButton_clicked();
 
 
private:
    Ui::MainWindow *ui;
};
 
 
#endif // MAINWINDOW_H
 
 

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>
#include <QLibrary>
 
 
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}
 
 
MainWindow::~MainWindow()
{
    delete ui;
}
 
 
void MainWindow::on_pushButton_clicked()
{
    typedef int(*FUN2)(int, int); //  函数指针,定义函数add别名
    QLibrary lib("../MyDialog1/sld.dll");//指定dll路径,可以不在exe目录下
 
 
    if(lib.load())
    {
        qDebug() << "load ok!";
        FUN2 add = (FUN2)lib.resolve("add");
 
 
        if (add)
        {
            qDebug() << "load add ok!";
            qDebug() << add(3, 5);
        }
        else
        {
            qDebug() << "load add error";
        }
 
 
    }
    else
    {
        qDebug() << "load error!";
    }
}
 
 
 
 

总结:1、显式调用目前只能调用外部函数,没有看到能调用类中的函数()也就是无法调用内部函数



猜你喜欢

转载自blog.csdn.net/wise18146705004/article/details/81007328
今日推荐