Matlab R2010a和vs 2010混合编程

来源:互联网 发布:怎么在淘宝上买种子 编辑:程序博客网 时间:2024/05/17 00:41
点击打开链接

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++的头文件搜路路径。

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();
}
0 0
原创粉丝点击