(最近因程序中需要数值计算和做图表,研究了matlab与vs混合编程。结合网上的各种版本及个人摸索,找到一种可行且又简单易学的方法,现拿与大家分享)
一、在Matlab中用m文件生成C/C++的DLL
打开Matlab
在command窗口输入mex-setup选择编译器
在command窗口输入mbuild-setup选择编译器
写一个正确的m函数(如add.m),放在可找到路径中
在command窗口输入 mcc -B csharedlib: rename Jadd.m(rename 是生成各种C文件的命名,Jadd.m是要编译的m 函数所在m文件)
或者: mcc -W lib:myadd -T link:lib add.m(用于C的)
mcc -W cpplib:myadd -T link:lib add.m(用于C++的)
mcc -C -W cpplib:myadd -T link:lib add.m(这个多生成一个.ctf文件,有时要用到,推荐这个)
(现在耐心等一会,matlab会生成你所需的东西并放到它的默认路径下)
二、创建和配置项
(一)、在VS2010里新建一个C++控制台程序
(二)、把用matlb文件生成的dll、lib、h等一并拷到该程序目录里
(三)、(这里以MatlabR2010b为例)把R2010b\\extern\\include和R2010b\\extern\\lib\\win32\\microsoft这这两个夹拷到你的程序目录(不同matlab版本放的位置及命名略有不同,总能找到的)
(四)、在VS2010里的解决方案资源管理器中的项目图标右击》属性》VC++目录
然后 (1)在包含目录中添加你从matlab拷出来的include夹
(2)在库目录中添加你从matlab拷出来的microsoft夹
(五)、这样就差不多了(个人感觉这是最简单的方式),下面开始写代码(注意 J_add是我自己的lib名字哦,要换成你的):
三、在代码中调用DLL
#pragma once
#pragma comment(lib,"J_add.lib")
#pragma comment(lib,"mclmcrrt.lib")
#pragma comment(lib,"mclmcr.lib")
#include<iostream>
#include "mclmcrrt.h"
#include "J_add.h"
int main()
{
std::cout<<"function y = J_add(A)"<<std::endl;
if(!mclInitializeApplication(NULL,0)) //初始化MCR,用完还要关闭,节省资源
{
std::cout<<"could not initialize the application!"<<std::endl;
return -1;
}
if(!J_addInitialize())//初始化应用,用完还要关闭,节省资源
{
std::cout<<"could not initialize J_add!"<<std::endl;
return -1;
}
try
{
mwArray in1(2,2,mxDOUBLE_CLASS);
mwArray in2(2,2,mxDOUBLE_CLASS);
mwArray out(1,mxDOUBLE_CLASS);
//下面将C++矩阵赋给m矩阵:
double *in1Data = new double[4];
for(int i=0;i<4;i++)
{
in1Data[i] = 1.0*(i+1);
}
std::cout<<"input1="<<std::endl;
std::cout<<in1Data[0]<<" "<<in1Data[1]<<std::endl;
std::cout<<in1Data[2]<<" "<<in1Data[3]<<std::endl;
in1.SetData(in1Data,4);//
//m矩阵直接赋值法:
in2(1,1) = 1;
in2(1,2) = 2;
in2(2,1) = 3;
in2(2,2) = 4;
//将m矩阵赋给C++矩阵:
double *in2Data = new double[4];
in2.GetData(in2Data,4);
std::cout<<"input2:"<<std::endl;
std::cout<<in2Data[0]<<" "<<in2Data[1]<<std::endl;
std::cout<<in2Data[2]<<" "<<in2Data[3]<<std::endl;
//调用DLL函数J_add(该函数名字通原m文件中命名相同)
add(1,out,in1);
//std::cout<<"size of output:"<<out.operator size_t()<<std::endl;
std::cout<<"value of output:"<<out.ToString()<<std::endl;
delete []in1Data;
delete []in2Data;
}
catch(const mwException&e)
{
std::cerr<<e.what()<<std::endl;
}
J_addTerminate();//结束lib引用
mclTerminateApplication();//结束MCR
return 0;
}
附:上面例子中的m文件add.m原文如下:
function sum = add(A)
%用于C/C++的通用的求和函数
sum = sum(sum(A));
end