Qt调用C++动态链接库

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/yanmanm/article/details/82704651

最近在学习Qt调用C++模块的方法,本文在结合几篇文章的基础上,完成了Qt调用C++动态链接库(Dll)的方法,亲测有效:
声明:
事先我已经用C++写了一个简单的dll文件(myCurve.dll)。首先,从dll中导出了导入库(.lib)文件,dll中有一个接口函数,原型如下:
int StartCurveTool(void);//启动曲线工具
下面分别通过显示调用和隐式调用两种方法,来模拟Qt如何调用外部dll文件中的功能函数。
新建QT工程:
新建一个默认的Widgets工程,如下图所示

点击“Choose”按钮后在弹出的界面中输入工程名,然后“下一步”、“下一步”……直到“完成”即可。
添加槽信号:
双击工程下“界面文件”中的.ui文件,添加一个Push Button控件,改名为“曲线”,右击该button,选择“转到槽”,在下面的界面中选择clicked()信号,点击OK,添加并跳转到槽函数on_pushButton_clicked()。

调用DLL:
1、显示调用
Qt提供了一个 QLibrary 类供显示调用。下面给出一个完整的例子:

include “mainwindow.h”

include “ui_mainwindow.h”

include //QLibrary 显示不全,进行注释

include //QDebug

include //QMessageBox

include “CurveToolExport.h”

typedef int (* startCurveToolFunc)(void);
……
……
void MainWindow::on_pushButton_clicked()
{
QLibrary myLib(“CurveTool.dll”);
if(myLib.load())
{
startCurveToolFunc start = (startCurveToolFunc)myLib.resolve(“StartCurveTool”); //启动曲线工具
if(start)
{
start();
}
else
{
QMessageBox::information(NULL, “NO”, “Link to function is not ok!”);
}
}
else
{
QMessageBox::information(NULL, “NO”, “DLL is not loaded!”);
}
}
注意:
1) dll的接口函数要用extern “C”声明
2) 调用时在QT中定义接口函数的指针。
2、隐式调用
这个时候我们需要三个文件,头文件(.h)、导入库文件(.lib)、动态链接库(.dll),具体步骤如下:
1)首先我们把 .h 与 .lib/.a 文件复制到程序当前目录下,然后再把dll文件复制到程序的输出目录,
2)在工程文件右键点击,选择“添加库”,弹出如下界面:

选择“外部库”,点击“下一步”,进入下面界面:

单击“库文件”后面的“浏览”按钮,选择要添加的库文件,本例中添加myCurve d.lib(Debug版本)/ myCurve.lib(Release版本),下面的包含路径会自动映射到lib库所在的目录。
“下一步”可以看到在.pro文件中自动生成添加代码,直接“完成”即可。
3)代码实现
在程序中include头文件(我用的dll是用C++写的,因此要用 extern “C” { #include “dll.h” } )
下面是隐式调用的实例代码:

include “mainwindow.h”

include “ui_mainwindow.h”

extern “C”
{
#include “CurveToolExport.h”
}
……
……
void MainWindow::on_pushButton_clicked()
{
StartCurveTool();
}
构建——运行,点击界面中的“曲线”按钮,可以正确启动曲线工具界面。

总结:
显示调用代码多,实现复杂;所以如果在没有导入库文件(.lib),而只有头文件(.h)与动态链接库(.dll)时,我们才需要显示调用,如果这三个文件都全的话,我们就可以使用简单方便的隐式调用。

展开阅读全文

没有更多推荐了,返回首页