Qt如何使用lib库封装界面二(Qt5动态链接库创建和使用)
其实这三个链接的操作照着做就行啦,很简单,只有一个地方最关键:就是文件路径的配置。只有这个地方容易出错,其他的都不会有问题出现。上传的代码一定有用,只要你路径配置正确。欢迎下载
推荐学习链接是:
①https://blog.****.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.****.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.****.net/vample/article/details/78850369
动态链接库显示调用操作的源码:https://download.****.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、显式调用目前只能调用外部函数,没有看到能调用类中的函数()也就是无法调用内部函数