最近由于在项目中要用到matlab的算法,而用C++转换matlab算法非常麻烦,所以采用qt+matlab混合编程的方法,在使用中遇到了些许问题,特记录如下。
一、生成matlab库
1、首先需要下载matlab完整版,之前在网上下载的简版,发现在调用过程中缺失很多头文件信息。
下载安装完成后,需要先配置mingw编译器,采用setenv('MW_MINGW64_LOC','C:\Qt\Qt5.14.2\Tools\mingw730_64')命令配置,由于安装qt时已存在mingw编译器,所以可以直接使用qt下的mingw编译器,由于matlab一般是64位,所以需要使用64位的mingw。
mingw配置完成后,需要配置c++编译器,调用mbuild -setup命令
选择mingw64 Compiler + mex -setup C++ -client MBUILD选项
2、创建matlab文件
3、在命令行中输入deploytool命令,选择Library Compiler选项
选择C++ Shared Library,点击右侧加号按钮,选中需要生成dll库的源文件,最后点击Package选项生成dll文件
在for_redistribution_files_only文件夹下可以看到生成的dll文件,拷贝*.dll、*.h文件到qt工程目录下
至此,dll库制作完成
二、qt加载matlab库
1、首先在pro文件中需要先配置matlab的依赖库及头文件信息 2、加载matlab生成的dll库
3、在qt中调用matlab函数
编译运行,即可看到对应的结果。此处需要配置matlab的运行库环境,否则运行qt程序时会异常退出。
在matlab安装目录下,找到runtime文件,配置系统环境变量,F:\matlab2020b\runtime\win64;
三、运行部署
目前还为发布程序,待补充,理论上,生成dll库,可能需要生成带运行环境的dll库,即在packing options下选择Runtime include in package选项。
四、总结
1、找不到mclmcrrt.h、mclcppclass.h等matlab头文件信息,主要是第一次安装的是matlab的简版,导致很多头文件信息找不到,后续替换为完整版后,结局。
2、编译链接软件时提示undefined reference ‘xxxx’,即找不到matlab生成的库函数,主要原因是matlab的编译环境没有设置为C++编译环境,导致生成函数名称不匹配。
解决此问题有2中方法:
a、通过上述步骤1,配置matlab的c++环境,重新生成dll库,编译链接解决。
b、通过vs下的dumpbin命令,查看对应dll库中的函数名称,dumpbin -exports testadd.dll
_Z7testaddiR7mwArrayRKS_S2_及dll库中的函数名称,通过函数指针的形式进行访问调用,即显式加载dll库。