由于项目需要,需要调用现有的matlab程序,考虑将matlab程序生成动态链接库,再在Qt下动态调用。在这个过程中,遇到了许多问题,写个文章mark一下。
1.环境准备
我的电脑是win10,也先装了VS2015,64位的matalb 2018 。我之前一直是用的Qt的mingw版本,32位。但是在Qt下调用matlab程序,需要两者版本一致,都为64位(32位)。苦逼的是,Qt官方并未提供mingw的64位版本,网上有一些网友编译好的版本,也可以自行编译。
参考网址:https://blog.csdn.net/an505479313/article/details/55105397
我尝试过按上述方法编译官方提供的源码,编译完仍出错。我后来下载了QT的msvc 64位的版本。接下来简单介绍Qt5.6.3 + VS2015 的环境搭建过程。
参考1:https://blog.csdn.net/an505479313/article/details/55105397
在Qt中路径中有空格时会被认为换行,使用$$quote()
参考2:《Qt Creator快速入门》
参考3:VS2015+Qt
参照上述链接配置好环境后就能在Qt creator切换MinGw32位,MSVC2015 64位了!
2.QT与Matalb混合编程
参考1:https://blog.csdn.net/qq_33221028/article/details/78398408
参考2:https://blog.csdn.net/HongAndYi/article/details/79477031
3.注意:
1.win10 sdk版本选择:我在装完调试器,搭建好环境后,运行程序,出错:无法链接到rc.exe。原因是我装的sdk版本与vS2015不匹配,只支持2017。支持的VS2015有win 10 的14393版本。卸掉,重装win10 sdk。重装完之后,又出现了找不到setdff.h文件的问题,我在C:\Program Files (x86)\Windows Kits\10\Include下找到了该文件,于是在环境变量加入该路径,重启一下电脑,问题解决。
2.用
extern “C”
{#include"mydll.h";
}
出错:error: C2894: 模板不能声明为有“C”链接
将extern ”C“去掉
3.Qt本身的bug:出现一大堆错误:
link2019:无法找到xxx.obj
解决:把bulid-xxx-Debug目录直接手动删除,重新构建,问题解决。
4.用mwArray抛出异常,在用mwArray注意要先初始化。
用记事本打开用matlab生成的导出的头文件xxx.h,可以看到有这个函数
参考1:https://blog.csdn.net/HongAndYi/article/details/79477031
最后贴上我的完整代码:
matlab下:
导出m'y'Fundll.h myFundll.lib myFundll.dll
从myFundll.h中可以看到导出的函数 myFun(int nargout, mwArray& b, const mwArray& a);