下面是我对Qt隐式/显式调用DLL一点理解,我参考的相关网址会在下面罗列出来:
①显示调用
这里我觉得http://www.cnblogs.com/newstart/archive/2013/01/23/2873611.html的例子挺好的,使用Qt创建了一个加法函数和查询页面并封装成DLL以供Qt调用。
在头文件里申明DLL共享接口:
#include "MyTestDll_global.h"
#include "qdialog.h"
extern "C++" Q_DECL_EXPORT int add(int a,int b);
extern "C++" Q_DECL_EXPORT QDialog *showDialog();
在源文件里添加DLL共享接口:
int add(int a,int b)
{
return a+b;
}
QDialog *showDialog()
{
MyShowTest *ss=new MyShowTest();
return ss;
}
生成后将DLL置于需要调用该DLL的工程的输出目录中,调用DLL程序部分如下:
QLibrary mylib("MyTestDll.dll"); //声明所用到的dll文件
int result;
QString sresult;
if (mylib.load()) //判断是否正确加载
{
Fun open=(Fun)mylib.resolve("add"); //援引 add() 函数
if (open) //是否成功连接上 add() 函数
{
int s1=this->ui->lineEdit->text().toInt();
int s2=this->ui->lineEdit_2->text().toInt();
result=open(s1,s2); //这里函数指针调用dll中的 add() 函数
sresult=QString::number(result);
this->ui->lineEdit_3->setText(sresult);
}
}
else
{
QMessageBox::information(NULL,"NO","DLL is not loaded!");
}
注意须添加qlibrary.h 。
http://blog.csdn.net/derryzhang/article/details/4653708这里用VS搭配Qt写了一个DLL文件,然后Qt调用该DLL。其特别之处在于,用VS搭配Qt写DLL时用到了模块定义文件。
②隐式调用
参考http://www.cnblogs.com/hicjiajia/archive/2010/08/27/1810239.html
参考https://blog.csdn.net/liang19890820/article/details/52933198
LIBS+= -LD:/qt/MyTest_2 -lMyTestDll
注:1、-L 参数指定 .lib/.a 文件的位置
2、-l 参数指定导入库文件名(不要加扩展名)
3、另外,导入库文件的路径中,反斜杠用的是向右倾斜的
4、Qt要隐式调用DLL的话,须把dll文件放在程序的输出目录中,lib所存放的文件路径随便,但是须由上述.pro文件中的LIBS指定语句指定其所在文件夹,.h文件放在程序当前目录下即可。
调用DLL程序部分如下:
extern "C++"
{
#include "mytestdll.h"
}
int main(int argc ,char **argv)
{
QApplication app(argc,argv);
qDebug()<show();
return app.exec(); //完成使命后,直接退出,不让它进入事件循环
}
简述
在 Qt 中经常会用到第三方库,例如:FFmpeg、OpenCV 等。第三方库的使用比较简单,只需要一些基本的配置就可以搞定,一起来看看吧!
第三方库
假设你需要依赖一个跨平台的库 - MyLibrary,并且有几个文件作为库的一部分。我们的项目 MyQtApp 将这些文件存储在名为 3rdparty 的文件夹中:
MyQtApp/
MyQtApp.pro
src/
main.cpp
3rdparty/
MyLibrary/
include/
MyLibrary.h
lib/
libMyLibrary.so
MyLibrary.lib
bin/
MyLibrary.dll
要在 MyQtApp 中使用 MyLibrary 库,qmake 需要 MyLibrary 库的位置和名称。你也可以选择:
提供 MyLibrary 源代码的位置,以便在将它们包含在自己的代码中时,不必输入每个文件的完整路径。
选择 MyQtApp 可执行文件将被创建的目标目录。
上面的信息在 .pro 文件中提供,以便 qmake 可以解析它并生成 makefiles。Makefiles 包含编译器和链接器生成输出所需的所有信息,无论它是可执行文件,另一个库文件等。
源代码
使用 INCLUDEPATH 变量提供 MyLibrary 的 include 目录路径:
INCLUDEPATH += $$PWD/3rdparty/MyLibrary/include
然后,就可以这样使用:
#include
而不是:
#include <3rdparty/MyLibrary/include/MyLibrary.h>
库文件
要让 qmake 知道在哪里可以找到 MyLibrary 库文件,使用 LIBS 变量:
LIBS += -L$$PWD/"3rdparty/MyLibrary/lib" -lMyLibrary
表达式的第一部分(-L...):使链接器知道应该在哪个目录中查找库文件。双引号只在路径包含空格时才需要,因此此处可以省略。
表达式的第二部分(-l...):告诉链接器链接哪些库。对于 Windows 和 UNIX 平台,有两个不同的库文件:MyLibrary.lib 和 libMyLibrary.so,没有必要指定 .lib 扩展名,也不必指定 lib 前缀(在 UNIX 平台上)。
目标目录
默认情况下,qmake 在与 .pro 文件相同的目录中创建可执行文件,可以使用 DESTDIR 变量来选择自己的目录:
DESTDIR = bin
就这么简单,现在可以在项目中使用 MyLibrary 库了。最终的 .pro 文件如下所示:
TARGET = MyQtApp
TEMPLATE = app
INCLUDEPATH += $$PWD/3rdparty/MyLibrary/include
LIBS += -L$$PWD/"3rdparty/MyLibrary/lib" -lMyLibrary
SOURCES += src/main.cpp
无论使用什么库,配置基本都大同小异,Good Luck!
总的说一句:
显式调用:需要在程序里使用语句将DLL导入,打开共享库,使用后再关闭。
隐式调用:不需要使用语句导入,直接调用即可。