QT中错误提示如下:
mainwindow.obj error: LNK2019: 无法解析的外部符号 “__declspec(dllimport) int __cdecl add(int,int)” (_imp?add@@YAHHH@Z),该符号在函数 “public: __thiscall MainWindow::MainWindow(class QWidget *)” (??0MainWindow@@QAE@PAVQWidget@@@Z) 中被引用
debug\untitled2.exe error: LNK1120: 1 个无法解析的外部命令
用QT+MSVC2015 32bit调用visual studio 2017中导出的动态链接库,按照QT调用QT自己导出的动态库的方式(具体步骤可点击链接)已经导入了该动态库。编译时报错,识别不了外部符号 "__declspec(dllimport) "。在网上搜索一通,什么.lib库没有加载,链接不正确,各种改,就是不行。
下图是我动态库20190703.h的内容,为了测试,就写了一个简单的add函数,动态库20190703.dll是从VS2017中导出的。
代码如下:
QLibrary my_dll("20190703.dll");
if(my_dll.load()){
qDebug()<<"20190703.dll load successfully";
//int c=add(1,2);
typedef int (*add)(int,int);
add Add = (add)my_dll.resolve("add");
int c=Add(5,2);
qDebug()<<c;
}else{
qDebug()<<"failed to load 20190703.dll";
}
使用QT+MinGW导出和调用动态链接库,导出的类和函数是可以像普通函数一样直接调用的,没有出现过无法解析的外部符号 “__declspec(dllimport) “这个问题。
VS的编译器和MinGW不是一个体系,我本以为调用VS导出的动态链接库时必须使用QT+MSVC环境,但今天试了一下,QT+MinGW环境用上述QLibrary类可以成功调用VS中导出的动态链接库。
QLibrary提供与平台无关的方式访问库中的函数,resove()函数可以用来解析库中的符号地址。