第三方库/程序是别人提供的库/程序(例如开源库/程序, 或者我们从别的公司买过来的基础库/程序)
如ffmpeg库 opencv库等 在第二篇我会讲解 如何在QT中调用opencv第三方库
优点避免重复造轮子,提升开发效率,移植方便,减少项目代码量,便于管理,Dll库可以供多种编程语言使用
缺点如果第三方库存在问题,不太好定位问题,降低了项目灵活性
以QtCreator编辑器为例
创建Library库项目
在这里我们选择我们需要用到的模块,因为我们这个demo只需要导出不包含QT界面的C++ dll 因为QtGui模块可以不选择
新建项目完成后 我们获得这样一个文件列表的项目
这里我们需要图标注意这下jbydll_global.h这个文件
这里对Q_DECL_EXPORT做了重定义
那么Q_DECL_EXPORT关键字的含义是什么呢
摘自QT文档 :
根据您的目标平台上,Qt提供了包含必要的定义特殊的宏:
Q_DECL_EXPORT必须被添加到符号的编译一个共享库时使用的声明。
Q_DECL_IMPORT必须被添加到符号的编译使用共享库的客户机时使用的声明。
那我们就理解成:Q_DECL_EXPORT宏主要为了导出这个类,生成.dll的同时生成.lib文件。提供给外部接口供其他类使用。
这里我参考其他博主的demo,写了一个add加法函数
在jbydll.h文件中添加如下代码
#ifndef JBYDLL_H
#define JBYDLL_H
#include
#if defined(JBYDLL_LIBRARY)
# define JBYDLLSHARED_EXPORT Q_DECL_EXPORT
#else
# define JBYDLLSHARED_EXPORT Q_DECL_IMPORT
#endif
class JBYDLLSHARED_EXPORT JbyDLL
{
public:
JbyDLL (int a,int b);
int Add();
int a;
int b;
};
#endif // JBYDLL_H
在jbydll.cpp文件中添加如下代码
#include "jbydll.h"
//构造函数中 传入 a,b的值
JbyDLL::JbyDLL(int a, int b)
{
this->a=a;
this->b=b;
}
//讲a和b的值相加并返回
int JbyDLL::Add()
{
return this->a+this->b;
}
然后我们点击编译就可以获得需要的DLL和LIB文件了
这里还需要注意一点 在不同的编译环境下 生成的dll只能被相同编译环境的程序调用
编译成功后就可以在构造目录下找到我们需要的DLL 和 LIB文件了
下面分别通过显示调用和隐式调用两种方法,来实现Qt如何调用外部dll文件中的功能函数
预备知识:
1、如果在没有导入库文件(.lib),而只有头文件(.h)与动态链接库(.dll)时,我们才需要显示调用,
如果这三个文件都全的话,我们就可以使用简单方便的隐式调用。
2、通常Windows下程序显示调用dll的步骤分为三步(三个函数):LoadLibrary()、GetProcAdress()、FreeLibrary()
其中,LoadLibrary() 函数用来载入指定的dll文件,加载到调用程序的内存中(DLL没有自己的内存!)
GetProcAddress() 函数检索指定的动态链接库(DLL)中的输出库函数地址,以备调用
FreeLibrary() 释放dll所占空间
1.显示调用
我们可以参考这篇博客实现
参考:https://www.cnblogs.com/hicjiajia/archive/2010/08/27/1810239.html
2、隐式调用
我们需要三个文件,头文件(.h)、导入库文件(.lib)、动态链接库(.dll),具体步骤如下:
1、首先我们把 .h 与 .lib/.a 文件复制到程序当前目录下,然后再把dll文件复制到程序的输出目录(否则直接运行会导致程序崩溃)
2、下面我们在pro文件中,添加 .lib 文件的位置: LIBS += -L$$PWD/jbyDLL/ -ljbyDLL
-L 参数指定 .lib/.a 文件的位置
-l 参数指定导入库文件名(不要加扩展名)
另外,导入库文件的路径中,反斜杠用的是向右倾斜的
3、在程序中include头文件(如果用的dll是用C写的,要用 extern “C” { #include “jbydll.h” } )
下面是隐式调用的实例代码:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "jbydll.h"
#include
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
JbyDLL dll(0,999);
qDebug() << dll.Add();
}
在下一篇我会讲解 两个内容
【Qt 导出生成并使用第三方库】02:导出带QT界面且依赖opencv库的DLL 并使用
1.导出带QT界面的DLL文件 并使用
2.导出带QT界面且依赖opencv第三方库的DLL文件 并使用
本篇源码
https://github.com/jbyyy/QtDllLearing/tree/main/test1
【Qt 导出生成并使用第三方库】01:导出C++内容的DLL 并使用
【Qt 导出生成并使用第三方库】02:导出带QT界面且依赖opencv库的DLL]
【Qt 导出生成并使用第三方库】03:导出供MFC调用且带QT界面的DLL