1、使用Mideva,只支持matlab6以前的版本。
2、使用Matlab引擎来调用m文件,但是必须在目标机器上安装matlab才行,不现实。
3、使用mcc将m文件编译成为C/C++代码,然后导入VC编译,因为常常生成很多源代码,使用很繁琐。
4、使用mcc将m文件编译为头文件、dll和lib然后导入VC编译。目前这是最可行的一种方法。因此采取这种方法。
A、Linux下应先安装gcc和build-essential:
$sudo apt-get install gcc
$sudo apt-get install build-essential
Matlab命令窗口执行mex –setup命令,选择“mex -setup C++”选项
创建testAdd.m函数文件,实现最简单的加法运算,输入两个参数,返回两数之和。
function c = testAdd( a,b )
c=a+b;
end
Matlab命令行执行命令:
Mcc -W cpplib:testAddDLL -T link:lib testAdd
也可使用命令(mcc -l testAdd),生成名称为testAdd的h、dll和lib文件
生成testAddDLL.h、testAddDLL.dll、testAddDLL.lib并放入VS项目目录下
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
基本步骤:
代码:
#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