下面是我对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");
- int result;
- QString sresult;
- if (mylib.load())
- {
- Fun open=(Fun)mylib.resolve("add");
- if (open)
- {
- int s1=this->ui->lineEdit->text().toInt();
- int s2=this->ui->lineEdit_2->text().toInt();
- result=open(s1,s2);
- sresult=QString::number(result);
- this->ui->lineEdit_3->setText(sresult);
- }
- }
- else
- {
- QMessageBox::information(NULL,"NO","DLL is not loaded!");
- }
注意须添加qlibrary.h 。
http://blog.youkuaiyun.com/derryzhang/article/details/4653708这里用VS搭配Qt写了一个DLL文件,然后Qt调用该DLL。其特别之处在于,用VS搭配Qt写DLL时用到了模块定义文件。
②隐式调用
参考http://www.cnblogs.com/hicjiajia/archive/2010/08/27/1810239.html
- LIBS+= -LD:/qt/MyTest_2 -lMyTestDll
注: 1、-L 参数指定 .lib/.a 文件的位置
2、-l 参数指定导入库文件名(不要加扩展名)(注意-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()<<add(5,6);
- QDialog *d=showDialog();
- d->show();
- return app.exec();
- }
总的说一句:
显式调用:需要在程序里使用语句将DLL导入,打开共享库,使用后再关闭。
隐式调用:不需要使用语句导入,直接调用即可。