1.Qt中认为C++ Library有三种形式:
(1) Shared Library -- 共享库
1> 共享库,在Windows下生成的是DLL文件,也可叫动态库。Qt6更新后,将选择默认支持模块整理为图中4种类型。它们的区别表现为:
<1> 选择Core模块,QT -= gui。
<2> 选择Gui模块,QT += gui。
<3> 选择Widget模块,QT += widgets。
新建动态库文件组织接口、接口文件和目标结果文件如下图所示:
扩展一下,增加槽和信号的测试,即接口类需要继承自QObject。 接口类头文件:
#include <QObject>
class DYNLIB_EXPORT DynLib : public QObject
{
Q_OBJECT
public:
DynLib(QObject *parent = nullptr);
int test();
public slots:
void slot_test();
signals:
void signal_test();
};
接口类源文件
DynLib::DynLib(QObject *parent) : QObject(parent)
{
}
int DynLib::test()
{
qDebug() << "this is a test function";
emit signal_test();
return 0;
}
void DynLib::slot_test()
{
qDebug() << "this is a slot test";
}
在控制台程序中进行简单测试使用
#include <QCoreApplication>
#include "../../DynLib/dynlib.h"
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
DynLib _lib;
QObject::connect(&_lib, &DynLib::signal_test, &_lib, &DynLib::slot_test);
_lib.test();
return a.exec();
}
2> 使用方式
在使用库函数的地方引入共享库头文件,可以使用相对路径,也可以使用绝对路径。
#include <QCoreApplication>
#include "../../DynLib/dynlib.h"
在*.pro文件中加载dll文件。
-L 后边为dll文件所在路径,支持相对路径和绝对路径。
-l 后边为dll文件名称,-l表示链接动态库命令。
LIBS += -L../build-DynLib-Desktop_Qt_6_4_3_MinGW_64_bit-Debug/debug/ -lDynLib
使用动态库中函数。
DynLib _lib;
_lib.test();
(2) Statically Linked Library -- 静态库
编译后生成一个lib文件,MSVC编译器生成的文件后缀为“lib”,MinGW编译器生成的文件后缀为“a”。
使用方式与动态库一致。
(3) Qt Plugin
暂未使用。
(4) C++中模块DLL对外暴露接口的方式
1> 导出API函数的方式
2> 到处类方式
3> COM方式