【Qt 导出生成并使用第三方库】01:导出C++内容的DLL 并使用

什么是第三方库

第三方库/程序是别人提供的库/程序(例如开源库/程序, 或者我们从别的公司买过来的基础库/程序)
如ffmpeg库 opencv库等 在第二篇我会讲解 如何在QT中调用opencv第三方库

为什么要用第三方库

优点避免重复造轮子,提升开发效率,移植方便,减少项目代码量,便于管理,Dll库可以供多种编程语言使用
缺点如果第三方库存在问题,不太好定位问题,降低了项目灵活性

如何导出c++内容的第三方库

以QtCreator编辑器为例
创建Library库项目
【Qt 导出生成并使用第三方库】01:导出C++内容的DLL 并使用_第1张图片
在这里我们选择我们需要用到的模块,因为我们这个demo只需要导出不包含QT界面的C++ dll 因为QtGui模块可以不选择
【Qt 导出生成并使用第三方库】01:导出C++内容的DLL 并使用_第2张图片
新建项目完成后 我们获得这样一个文件列表的项目
【Qt 导出生成并使用第三方库】01:导出C++内容的DLL 并使用_第3张图片
这里我们需要图标注意这下jbydll_global.h这个文件
这里对Q_DECL_EXPORT做了重定义
那么Q_DECL_EXPORT关键字的含义是什么呢

摘自QT文档 :
根据您的目标平台上,Qt提供了包含必要的定义特殊的宏:

Q_DECL_EXPORT必须被添加到符号的编译一个共享库时使用的声明。
Q_DECL_IMPORT必须被添加到符号的编译使用共享库的客户机时使用的声明。

那我们就理解成:Q_DECL_EXPORT宏主要为了导出这个类,生成.dll的同时生成.lib文件。提供给外部接口供其他类使用。
【Qt 导出生成并使用第三方库】01:导出C++内容的DLL 并使用_第4张图片
这里我参考其他博主的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只能被相同编译环境的程序调用
【Qt 导出生成并使用第三方库】01:导出C++内容的DLL 并使用_第5张图片
编译成功后就可以在构造目录下找到我们需要的DLL 和 LIB文件了
【Qt 导出生成并使用第三方库】01:导出C++内容的DLL 并使用_第6张图片

如何使用c++内容的第三方库

下面分别通过显示调用和隐式调用两种方法,来实现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 导出生成并使用第三方库

【Qt 导出生成并使用第三方库】01:导出C++内容的DLL 并使用

【Qt 导出生成并使用第三方库】02:导出带QT界面且依赖opencv库的DLL]

【Qt 导出生成并使用第三方库】03:导出供MFC调用且带QT界面的DLL

你可能感兴趣的:(Qt,导出生成并使用第三方库,qt,c++,dll)