天天看点

Matlab R2010a和vs 2010混合编程include” libMyAdd.h”ifdef _CHAR16Tdefine CHAR16_Tendif

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

同上

举例:创建所需的Matlab函数文件 MyAdd.m

function [c] = MyAdd(a, b);

c = a + b;

然后,进行编译,命令如下:

mcc -W cpplib:libMyAdd -T link:lib MyAdd.m–C

会生成如下文件:

libMyAdd.cpp(这里有函数接口说明)

libMyAdd.dll

libMyAdd.h

libMyAdd.ctf

libMyAdd.lib

这四个是要用到的文件。

vs2010项目目录设置(MFC):

第一步:添加生成的动态链接库文件

把四个要要用到的文件,复制到vs工程目录下

第二步:选择项目->项目属性。选择C/C++->常规->附加包含目录:D:\Program Files\MATLAB\MATLAB Compiler Runtime\v713\extern\include(选择Matlab R2010a编译器路径,这样可以在没有安装Matlab的机器上运行,但必须安装Matlab的编译器MCR)

把MATLAB提供的include路径添加到VC++的头文件搜路路径。

第三步:连接器->常规->附加库目录:D:\Program Files\MATLAB\MATLABCompiler Runtime\v713\extern\lib\win32\microsoft(选择Matlab R2010a编译器路径,这样可以在没有安装Matlab的机器上运行,但必须安装Matlab的编译器)

添加MATLAB生成的响应的lib所在目录加入。

第四步:连接器->输入->附加依赖项:libMyAdd.lib;mclmcrrt.lib(中间必须是回车分开,回车以后自动生成“;“,不是空格键,也不是手动添加;这个,不然会出现找不到”libMyAdd.lib;mclmcrrt.lib“错误)

设置完成!

代码里要添加头文件即可

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();

}

继续阅读