QT调用动态链接库分为:
- 显式链接DLL,调用DLL的全局函数。
- 显示链接DLL,调用DLL中类对象、成员函数。
- 隐式链接DLL。
详细情况见下面一篇博文:
https://www.iteye.com/blog/qimo601-1397936
前段时间我想用QT调用C#的dll里面的函数,并且没有.h头文件和.lib静态库。由于只有dll文件,所以用显式链接。
但是在运行过程中发现有时候调用不成功,举例说明,代码如下:
typedef int (*Fun)();
QLibrary testLib("Protocol.dll"); //已把dll放在debug中
if (testLib.load())
{
Fun getObj = (Fun)testLib.resolve("OpenPort");
if (getObj)
{qDebug()<<"getObj";}
else
{QMessageBox::about(NULL,"result","resolve unSuccessfully");}
}
总结了以下几个可能导致失败的原因:
- 第一,搞清楚DLL文件是不是.net的,如果是则需要转换一下,用类库去封装C#的dll,在函数前面加上extern “C” _declspec(dllexport) ,这样编译完成生成的.lib .dll文件就可以被Qt项目直接调用了。可参考以下文章:
https://blog.csdn.net/weixin_42420155/article/details/81060945
https://blog.csdn.net/weixin_42420155/article/details/81538889
- 第二,搞清楚DLL的位数,并且QT的编译器的版本要和DLL对应,我就是这样解决的问题,把QT重新安装了一遍换成32位的,就可以成功。不过我也从MSVC换成了MinGW,这个也是影响因素之一。
- 第三,声明的函数名称是DLL中实际的函数名,可能是函数名不同导致,打开DLL找到正确的函数名尝试一下。并且,函数的参数声明也要正确。
- 第四,调用的DLL可能存在从属关系,利用函数查看工具查看缺少哪个库文件。