学习之前先了解一下链接库的基本知识链接库预备知识
库包含静态链接库 动态连接库 (动态装载:静态绑定与动态绑定)目前以lib后缀的库有两种,
一种为静态链接库(Static Libary,以下简称“静态库”), 包含了实际的代码和符号
一种为动态连接库(DLL,以下简称“动态库”)的导入库(Import Libary,以下简称“导入库”)。 包括地址符号表。
动态链接库的调用 隐示连接 与 显示连接
对Qt动态链接库的生成方法,主要包括:
1使用Qt中的库
2使用Qt的插件类QPlugin
对QT动态链接库的调用方法,主要包括:
1、显式链接DLL,调用DLL的全局函数,采用Qt的QLibrary方法
2、显式链接DLL,调用DLL中类对象、成员函数。(通过对象即可实现类成员函数的调用)①用虚函数表的方法,这也是COM使用的方法,利用Qt的QLibrary技术调用;
②用Qt的QPluginLoader类直接调用生成的DLL插件类对象。
3、隐式链接DLL:调用DLL全局函数以及类对象、成员函数。
显式连接
常Windows下程序显示调用dll的步骤分为三步(三个函数):LoadLibrary()、GetProcAdress()、FreeLibrary(),其中,
LoadLibrary() 函数用来载入指定的dll文件,加载到调用程序的内存中(DLL没有自己的内存!)。GetProcAddress() 函数检索指定的动
态链接库(DLL)中的输出库函数地址,以备调用。FreeLibrary() 释放dll所占空间。
Qt中的显式调用DLL使用采用Qt的QLibrary方法
QLibrary类显示链接调用DLL的步骤:load()、resolve(const char * symbol )、unload()与之对应
隐式链接
需要三个文件,头文件(.h)、导入库文件(.lib)、动态链接库(.dll),具体步骤如下:
1、首先我们把 .h 与 .lib/.a 文件复制到程序当前目录下,然后再把dll文件复制到程序的输出目录。
2、下面我们在pro文件中,添加 .lib 文件的位置: LIBS+= -L D:/hitempt/api/
-l myDLL
-L 参数指定 .lib/.a 文件的位置
-l 参数指定导入库文件名(不要加扩展名)
另外,导入库文件的路径中,反斜杠用的是向右倾斜的
LIBS的用法
LIBS += -L地址 -l库名 注意是
-L后面没有空格直接加地址,然后空格-l库名,地址和-l库名之间是有空格的。
Qt中的隐式调用 (这里的直接使用dll文件,dll文件是由Qt生成的,如果dll是由vs等其他生成还需验证)
INCLUDEPATH += -l-l 参数指定导入库文件名(不要加扩展名)
若将需要的头文件放入到了源程序目录下,可以不需要这一句
LIBS+=
-l 如果编译器为mingw 直接添加.dll文件不用添加.a文件
动态链接库(DLL)生成与使用
1 在Qt中创建C++库进而生成dll。QT5 动态链接库的创建和使用 这里连接给予了创建与使用,调用的方法采取的是隐式链接,调用了类对象、成员函
数,并没有调用全局函数。
接着上面连接的代码,完成调用全局函数。
在sld.cpp中添加
void shuchu()
{
qDebug() << "调用全局函数";
}
在sld.h中添加
extern "C" SLDSHARED_EXPORT void shuchu(); //自定义的外部函数
最后在mainwindow.cpp中添加
void MainWindow::on_pushButton_clicked()
{
···
shuchu(); //调用sld.dll中的全局函数
····
}
2将上面的隐式链接的程序进行修改,完成显式连接的调用
调用DLL的全局函数,采用Qt的QLibrary方法。
在mainwindow.cpp中添加
#include <QLibrary>
在其构造函数中添加typedef void (*Fun)(void); //定义函数指针
QLibrary mylib("sld.dll"); //声明所用到的dll文件 这个路径是默认的DESTDIR =..\MyDebug 实际情况根据dll的位置更改路径
if (mylib.load()){ //载入//调用外部函数shuchu()Fun add = (Fun)mylib.resolve("shuchu");//是否成功连接上 add() 函数if (add){
qDebug() << "Link to add Function is OK!"<<endl;//这里函数指针调用dll中的 add() 函数add();
}
}
mylib.unload(); //释放
调用DLL的类对象、成员函数。
a 虚函数表的方法,Qlibrary的技术调用
在sld.h中添加
virtual QString GetStr();
在sld.cpp中添加extern "C" SLDSHARED_EXPORT Sld* getSlddll(); //获取类Sld的对象
Sld* getSlddll()
{
return new Sld();
}
保存编译下。
在mainwindow.cpp中添加
#include "../sld/sld.h" //头文件还是需要加的,解析sld类
typedef Sld* (*GetSlddll)();//定义函数指针,获取类TestDLL对象;
QLibrary mylib("sld.dll"); //声明所用到的dll文件 这个路径是默认的DESTDIR =..\MyDebug 实际情况根据dll的位置更改路径if (mylib.load()) //载入{//调用类对象、成员函数GetSlddll getsld = (GetSlddll)mylib.resolve("getSlddll");if(getsld){
qDebug() << "SLD Link to add Function is OK!"<<endl;Sld *sld = getsld();QMessageBox * msg=new QMessageBox(this);msg->setText(sld->GetStr());msg->show();
delete sld;}
}
以上DLL在Qt创建与调用的方法对应的代码