Matlab与Qt的混合编程


Matlab是MathWorks公司出品的商业数学软件,用于数据分析、无线通信、深度学习、图像处理与计算机视觉、信号处理、控制系统等领域,其集成的数学算法种类丰富。Qt的优点在于界面的编辑简便,对于算法方面则略显薄弱,故如果将Matlab的算法集成到Qt编辑的程序中,则会扩充许多功能。
网上有几种不同的调用方式,我使用成功的是调用动态链接库(.dll),如果以后其他方式成功,则继续扩展。

调用动态链接库(.dll)

前期准备

(1)Qt与matlab的安装:本人使用的版本为Qt 5.10、matlab 2016b(需要注意的是matlab必须为完全破解版,否则没法编译文件);
(2)VS:本人使用的是Visual Studio 2015,VS的作用是编译.m文件,并在Qt中调用构建msvc的套件;
(3)win10 SDK:SDK的作用是作为调试器配合vs的编译器,构建Qt的编译套件,可在微软官网下载;

构建套件

(1)在Qt菜单栏中依次点击“工具”->“选项”->“构建和运行”->“构建套件”;
图片说明
(2)选择相应版本的编译器套件(这里是MSVC 2015 64bit),未能成功添加的都是显示感叹号,当然如果在Qt安装时未能安装该版本的套件,也可以点击添加进行手动添加,但是这样如果需要封装程序时,找不到相应的DeskTop,则可能封装就比较麻烦,还会缺失封装文件,故最好重新装上该套件;
(3)选择套件,并添加进编译器与调试器,如果VS与SDK安装成功,则应该会自动检测到文件,下拉选择即可,如果没有,则可以选择重装,或者手动将安装后的文件路径添加到环境变量中;
图片说明
(4)应用确定后,则构建好了MSVC 2015的套件了。

生成所需文件

(1)首先需要编好所需的.m文件,需要使用function函数来确定程序的输入输出接口;
图片说明
其中C就是需要的输出,A和B就是所需的输入接口。
(2)然后调用编译器,生成编译好的文件,即依次在Matlab中输入

!mcc(若出现error则说明未完全破解)
mex -setup(选择需要使用的编译器)
mbuild -setup(选择编译出的语言)
mcc -W cpplib:libmyFuc -T link:lib myFunc.m -C(cpplib:后面是编译出的文件名)

(3)至此,在.m文件的文件夹中则出现了编译出的文件(包括.lib、.h、.cpp、.dll等)。

Qt调用生成的文件:

(1)将生成的.h、.lib文件添加到项目文件夹中,并将.lib文件以外部库的形式添加到程序中,最好将选择框中的对号只留windows一项,添加为debug或release的情况,有时会调试出错;
图片说明
图片说明
(2)将Matlab的include文件夹路径添加到pro中,本人一般都是直接将include文件夹复制到项目文件中,再把其路径添进去,其实这一步的作用好像主要是为了找到其中的.h文件,下一步会将.h文件添加到.pro所在的目录中,但是我还是习惯将路径添加进去;
图片说明
(3)将依赖的.h文件添加到项目文件中,因为懒得去一个个尝试,所以可以将include文件中的.h文件都添加到项目中;
图片说明
(4)将需要用到的lib文件同样以外部库的形式添加到文件中,主要包括libmx.lib、mclmcr.lib、mclmcrrt.lib、libmat.lib、libmex.lib、libeng.lib;
图片说明
(5)前期准备完成,则可以开始编写Qt程序,进行调用,需要明白的是,Qt与Matlab的数据交互也是通过数组的形式进行的:

  • 首先将生成文件的.h文件#include到项目中;
  • 建立静态数组,并存入数据,因为我程序上面是使用动态数组获取的数据,所以需要转存一下;
    图片说明
  • 调用生成的函数,因为当时时间有限,所以用了这种数据存过来存过去的方式,虽然也知道会浪费进程时间,但是也没时间去改进,但是方法是切实可行的。
    图片说明

(6)最后,别忘了把生成的.dll文件与.ctf文件放入到生成的.exe文件相同的文件夹中,如果是调试模式就放入Debug文件中,如果是封装的文件包,则放入Desktop生成的文件中。