环境:Matlab R2010a,vs 2010 c++,XP, 32位操作系统
MatlabR2010a与vs2010 c++混合编程成功,在vs2010 c++中能够调用matlab的m函数,进行计算,得到正确结果,调用matlab中m函数转化成的dll文件
一、matlab编译环境的设置
>>mex –setup
Pleasechoose your compiler for building external interface (MEX) files:
Would you like mex to locate installed compilers [y]/n? n
这个地方如果选择y,那么就看不到vs2010 c++的编译器,只能看到C++6.0的(我电脑里装了这两个),我之前写的就是用C++6.0的编译器编译的DLL,再用VS2010可以调用成功的。如果这时候你想选择vs2010 c++的编译器,就要选择n,我想也应该可以的。
>> mbuild –setup
Would you like mex to locate installed compilers [y]/n? n
这个地方如果选择y,那么就看不到vs2010 c++的编译器,只能看到C++6.0的(我电脑里装了这两个),我之前写的就是用C++6.0的编译器编译的DLL,再用VS2010可以调用成功的。如果这时候你想选择vs2010 c++的编译器,就要选择n,我想也应该可以的。
>> mbuild –setup
同上
举例:创建所需的Matlab函数文件 MyAdd.m
function [c] = MyAdd(a, b);
c = a + b;
function [c] = MyAdd(a, b);
c = a + b;
然后,进行编译,命令如下:
mcc -W cpplib:libMyAdd -T link:lib MyAdd.m–C
mcc -W cpplib:libMyAdd -T link:lib MyAdd.m–C
会生成如下文件:
libMyAdd.cpp(这里有函数接口说明)
libMyAdd.dll
libMyAdd.h
libMyAdd.ctf
libMyAdd.lib
这四个是要用到的文件。
vs2010项目目录设置(MFC):
libMyAdd.cpp(这里有函数接口说明)
libMyAdd.dll
libMyAdd.h
libMyAdd.ctf
libMyAdd.lib
这四个是要用到的文件。
第一步:添加生成的动态链接库文件
把四个要要用到的文件,复制到vs工程目录下
第二步:选择项目->项目属性。选择C/C++->常规->附加包含目录:D:\Program Files\MATLAB\MATLAB Compiler Runtime\v713\extern\include(选择Matlab R2010a编译器路径,这样可以在没有安装Matlab的机器上运行,但必须安装Matlab的编译器MCR)
把MATLAB提供的include路径添加到VC++的头文件搜路路径。
file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image002.jpg
第三步:连接器->常规->附加库目录:D:\Program Files\MATLAB\MATLABCompiler Runtime\v713\extern\lib\win32\microsoft(选择Matlab R2010a编译器路径,这样可以在没有安装Matlab的机器上运行,但必须安装Matlab的编译器)
添加MATLAB生成的响应的lib所在目录加入。
file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image004.jpg
第四步:连接器->输入->附加依赖项:libMyAdd.lib;mclmcrrt.lib(中间必须是回车分开,回车以后自动生成“;“,不是空格键,也不是手动添加;这个,不然会出现找不到”libMyAdd.lib;mclmcrrt.lib“错误)
file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image006.jpg
设置完成!
代码里要添加头文件即可
#include" libMyAdd.h"
如果编译会有错误:“char16_t”: 重定义;不同的基类型“
只需要在" libMyAdd.h"中添加如下代码即可:
#ifdef _CHAR16T
#define CHAR16_T
#endif
程序代码(仅供参考):
voidCFUNCTIONADDDlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
if(!mclInitializeApplication(NULL, 0))
{
MessageBox(_T("could not initializethe application"));
}
if(!addtwoInitialize())
{
MessageBox(_T("could not initialiaeaddtwo"));
}
try
{
mwArray a(2, 2, mxDOUBLE_CLASS);
double *aData;
aData=new double[4];
int i;
for (i=0; i<4; i++)
{
aData=1.0*i;
}
a.SetData(aData, 4);
mwArray b(2, 2, mxDOUBLE_CLASS);
b(1, 1)=11;
b(1, 2)=12;
b(2, 1)=21;
b(2, 2)=22;
mwArray y(2, 2, mxDOUBLE_CLASS);
addtwo(1, y, a, b);
double *yData;
yData=new double[4];
if(yData==NULL)
{
MessageBox(_T("failed toallocate memory for y"));
}
y.GetData(yData, 4);
CString str;
str.Format(_T("%f, %f, %f,%f"), yData[1], yData[2], yData[3], yData[4]);
MessageBox(str);
delete []aData;
delete []yData;
}
catch (const mwException &e)
{
CString str;
str=e.what();
MessageBox(str);
}
addtwoTerminate();
mclTerminateApplication();
}