Qt隐式、显式调用第三方库Dll

下面是我对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导入,打开共享库,使用后再关闭。
隐式调用:不需要使用语句导入,直接调用即可。

你可能感兴趣的:(QT)