在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); |
编译运行之后,结果如下图: