Matlab与C++混合编程
- 一、Matlab与C++混合编程的方法
1、使用Mideva,只支持matlab6以前的版本。
2、使用Matlab引擎来调用m文件,但是必须在目标机器上安装matlab才行,不现实。
3、使用mcc将m文件编译成为C/C++代码,然后导入VC编译,因为常常生成很多源代码,使用很繁琐。
4、使用mcc将m文件编译为头文件、dll和lib然后导入VC编译。目前这是最可行的一种方法。因此采取这种方法。
- 二、m文件编译为h、dll和lib文件
2.1 matlab连接C++编译器
- windows环境:(win10+VS2017+matlabR2017b)
- 配置环境变量,path中添加VS安装目录(bin、tools、IDE)
- 下载msvc2017.xml、msvcpp2017.xml文件(2017为vs版本),拷贝到matlab目录bin/win64/mexopts下
- Matlab命令窗口执行mex –setup命令,选择“mex -setup C++”选项
- Linux环境(ubuntu18+gcc17+matlabR2016b)
A、Linux下应先安装gcc和build-essential:
$sudo apt-get install gcc
$sudo apt-get install build-essential
Matlab命令窗口执行mex –setup命令,选择“mex -setup C++”选项
2.2 准备m文件
创建testAdd.m函数文件,实现最简单的加法运算,输入两个参数,返回两数之和。
function c = testAdd( a,b )
c=a+b;
end
2.3 将m文件转换成h、dll和lib文件
Matlab命令行执行命令:
Mcc -W cpplib:testAddDLL -T link:lib testAdd
也可使用命令(mcc -l testAdd),生成名称为testAdd的h、dll和lib文件
生成testAddDLL.h、testAddDLL.dll、testAddDLL.lib并放入VS项目目录下
三、VC中使用matlab生成的h、dll、lib文件
3.1 VS环境准备(win10+VS2017+matlabR2017b)
A、电脑中添加Matlab运行环境: [电脑重启生效]
Path后面追加:C:\Program Files\MATLAB\R2017a\bin\win64
B、VS编译环境设置
项目-属性:
VC++目录-包含(include)目录(添加类似路径):
C:\Program Files\MATLAB\R2017a\extern\include
C:\Program Files\MATLAB\MATLAB Runtime\v92\extern\include
VC++目录-库(lib)目录(添加类似路径):
C:\Program Files\MATLAB\R2017a\extern\lib\win64\microsoft
C:\Program Files\MATLAB\MATLAB Runtime\v92\extern\lib\win64\microsoft
C:\Program Files\MATLAB\R2017a\extern\lib\win64\mingw64
C:\Program Files\MATLAB\MATLAB Runtime\v92\extern\lib\win64\mingw64
链接器(linker)-输入(input):
testAddDLL.lib
libmx.lib
libmat.lib
libmwservices.lib
mclmcr.lib
mclmcrrt.lib
3.2 编写VS测试代码
基本步骤:
- 初始化混合编程环境
- 准备输入变量
- 调用matlab函数
- 测试输出
- 关闭环境
代码:
#include "testAddDLL.h"
using namespace std;
int main() {
//初始化
mclmcrInitialize();
if (!mclInitializeApplication(NULL, 0)) return -1;
if (!testAddDLLInitialize()) return -1;
//定义输入变量,使用数组间接赋值,直接赋值会报错
mwArray a_ptr(1, 1, mxDOUBLE_CLASS, mxREAL);
mwArray b_ptr(1, 1, mxDOUBLE_CLASS, mxREAL);
//输入变量赋值
double data1[] = { 1.0 };
double data2[] = { 2.0 };
a_ptr.SetData(data1, 1);
b_ptr.SetData(data2, 1);
//定义输出变量
mwArray c_ptr;
//调用matlab中的方法testAdd
testAdd(1, c_ptr, a_ptr, b_ptr);// 输出参数的个数、输出参数、输入参数
//测试输出
double a, b, c;
a = a_ptr.Get(1, 1);
b = b_ptr.Get(1, 1);
c = c_ptr.Get(1, 1);
cout << "input a:" << a << ", b:" << b << " ,output c = "<< c << endl;
//关闭
testAddDLLTerminate();
mclTerminateApplication();
return 0;
}
测试结果输出:
四、调试时的问题
1、Debug错误:xsd_binder::MalformedDocumentError
原因:debug检查太严
解决方法:
属性-调试(debugging)-调试器类型(debugger type):自动(auto)修改成混合(mixed),并在调试中设置忽略并继续运行。
五:其他资料
mwArray: https://ww2.mathworks.cn/help/compiler_sdk/cxx/mwarray.html