由于MinGW 生成的库文件通常与 MSVC 生成的库文件不兼容。这意味着你不能将 MinGW 生成的对象文件与 MSVC 生成的库文件链接,反之亦然。
如果你使用 MinGW 编译你的应用程序,你需要确保你使用的库是专门为 MinGW 编译的,或者在构建库时采用兼容的编译选项。同样,如果你使用 MSVC 编译,你需要使用与 MSVC 兼容的库文件。
我参考了好几篇博客都是只能MSVC调用MSVC,MingW调用MingW,交叉调用一直报错,例如
参考:【QT】Qt Creator生成动态库(DLL)并调用_qt生成dll-CSDN博客
皇天不负有心人,经过多方尝试,总算找到一个能用Mingw编译器调用MSVC生成的dll库的方法。在此做个总结
利用vs生成MSVC库,并利用Qt的MingW编译器调用,可参考:Qt:编译器、MSVC、Mingw、dll调用_怎么调用 msvc编译-CSDN博客、Qt创建和使用动态链接库(.dll)-c++/QT/MFC-少有人走的路 (skcircle.com)
1、创建QT的MSVC项目
1)Qt新建一个C++lib库,选择MSvc格式
- 2)将testdynamiclib_global.h头文件中的内容拷贝到testdynamiclib.h头文件中,并添加功能代码;
//以C语言方式导出函数: extern "C" { MYDLL_EXPORT int Cadd(int a, int b); MYDLL_EXPORT int Csub(int a, int b); } |
Cpp代码:
3)执行qmake,并重新构建代码,后运行,弹窗忽略
4) 运行完后,新建一个MingW工程test,把头文件mydll.h放在新建的mingw项目pro文件夹中,
把mydll.lib和mydll.dll放在构建底层exe所在debug目录下,如图所示
2、利用QLibrary显式链接”dll动态库
显式链接共享库(QLibrary类)
特点:显式链接调用共享库是在应用程序运行时才加载共享库文件,并调用库里的函数的。应用程序编译时无需共享库的任何文件,只需知道函数名和函数的原型即可
添加头文件:#include <QLibrary>
1)在需要调用dll程序的cpp中先添加导入dll库函数
2)新建一点击按钮函数,对函数进行调用,如下
typedef int (*myFunadd)(int, int); // 声明函数指针类型,与DLL中导出的函数原型匹配 myFunadd myFunCadd = (myFunadd)myLib.resolve("Cadd"); // 假设函数名为"myFunctionName",此处为Cadd,与Dll中同名 if (!myFunCadd) { qDebug() << "can't find function"; //return -1; } int result = myFunCadd(1, 2); // 调用DLL中的函数 qDebug() << "return result:" << result; |
运行结果如下:Mingw编译器调用MSVC生成的dll库成功!