QT调用DLL库失败原因总结

QT调用动态链接库分为:

  1. 显式链接DLL,调用DLL的全局函数。
  2. 显示链接DLL,调用DLL中类对象、成员函数。
  3. 隐式链接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可能存在从属关系,利用函数查看工具查看缺少哪个库文件。

你可能感兴趣的:(QT)