在visual studio下调用MATLAB程序比较简单,但是在QT框架下用C++调用matlab复杂许多,网上诸多博客不够具体详细,这里结合我的实际过程以及相关博客,给读者分享一下QT调用MATLAB程序进行混合编程的基本流程。
编译DLL文件
作为例子,我先编写了一个简单的相加函数add_matlab.m,代码如下:
| 1 | function [p]=add_matlab(a,b) | 
保存之后,开始编译成DLL文件。
注意:
- 要想成功编译成 - DLL文件,首先你的- MATLAB得是成功破解的版本,否则会出现报错:- Test checkout of feature 'Compiler' failed。
- 需要配置 - MATLAB编译环境,在- MATLAB命令行窗口下输入- mbuild -setup,如下图: - 点击 - C++的选项进行安装。如果未出现上述信息,而是显示未找到支持的编译器或- SDK,则需要安装对应的编译器,要注意- MATLAB安装的编译器必须和你的- QT的编译器一个类型,绝对不要- QT是- MinGW编译器,而- MATLAB是- MSVC编译器,一定要一致。- 安装编译器后在命令行窗口中输入 - mex -setup C++,如果没有报错即安装成功。
在命令行输入deploytool,如下图:

选择Library Compile,如下图:

在TYPE栏选择C++ shared Library,在EXPORTED FUNCTIONS添加要编译的.m文件,本文以上述所写的add_matlab.m为例,点击右上角绿色的Package,即可产生DLL文件,文件夹如下图:

for_testing 目录下是用于测试的,但是dll不是可执行文件,不能直接进行进行测试。
for_redistribution目录下是文件MyAppInstaller_web.exe,这个是MATLAB运行时库的和本项目的安装文件,运行后可从网上下载MATLAB的运行时库进行安装,还会安装本项目生成的DLL、LIB和h文件。
此处我们选择第二个文件夹,我们将要使用的是其中的.h、.lib、.dll文件。

QT调用add_matlab.dll
首先我们创建一个QtWidget Application项目test_dll,界面如下

实现从文本框输入两个数值之后,qdebug出相加的结果。
添加.lib库
在项目目录下新建一个include目录,将前面编译生成的add_matlab\for_redistribution_files_only目录下的add_matlab.lib和add_matlab.h、add_matlab.dll文件复制到此目录下。
在Qt Creator里,项目节点上单击右键,选择“Add Library...”,在出现的向导中首先选择“External Library”,后续出现下图的界面,选择库test_dll\include\目录下的库文件add_matlab.Lib,其他选择如图。

在此对话框完成后,在test_dll.pro文件中会增加如下的几行:
| 1 | win32: LIBS += -L$$PWD/include/ -ladd_matlab | 
添加Matlab其他依赖库和头文件搜索路径
除了自己编译生成的DLL相关的.lib文件和头文件,要编译此Qt项目,还需要用到MATLAB的几个.lib文件和.h文件。
| 1 | # 用到的MATLAB 的.lib库文件 及其搜索路径 | 
此处路径为MATLAB安装路径,按照你的安装路径相应修改,要注意MATLAB安装路径不要带有空格(如Program Files),否则会被视为两行。
add_matlab.dll文件要复制到项目编译后的debug目录下。
QT编译
将add_matlab.h文件添加进项目中,并且在MainWidget.h文件中引用,随后使用add_matlab函数代码,如下图:

add_matlabInitialize()为初始化函数,一定要记得添加。
QT中使用mwArray类型数组作为MATLAB编译函数的输入输出数据接口,
| 1 | mwArray matrixA(rowCnt,colCnt,mxDOUBLE_CLASS, mxREAL); | 
此外add_matlab函数第一个参数int  nargout是输出参数个数,表示后面紧跟着的nargout个变量是输出参数
| 1 | extern LIB_add_matlab_CPP_API void MW_CALL_CONV add_matlab(int nargout, mwArray& C, const mwArray& A, const mwArray& B); | 
编译运行之后,结果如下图:

