matlab混合编程 deploytool

1.首先说我遇到的最大的问题,就是不能用matlab 自带的编译器 Lcc-win32,用这个可以成功编译出dll,但是我这里调用老是崩溃。我的matlab版本是2010a的win32版本,后来选用的编译器是 Microsoft Visual C++ 2008,可以成功编译且正确调用。

2.设置编译器的方法

mbuild -setup

然后选择vs2008,然后后面都是选y,成功后会显示done

3.遇到重定义的错误,如下

Error    1    error C2371: 'char16_t' : redefinition; different basic types    d:\program files\microsoft visual studio 12.0\vc\include\yvals.h  

解决办法如下定义就可以解决

#include
#if (_MSC_VER >= 1600)
#define __STDC_UTF_16__
#endif


#include "matrix.h"
#include "mex.h"

4.运行遇到的问题就是一定要安装mcr的环境

安装文件在matlab 的安装目录下

我这里的目录是 

D:\Program Files (x86)\MATLAB\R2010a\toolbox\compiler\deploy\win32

把这个MCRInstaller.exe安装了,如果你要到其他 的电脑上去运行,就要在哪台电脑上安装这个。

安装完后,还要在系统的环境变量path那里添加运行时环境的路径,我这里是

D:\Program Files (x86)\MATLAB\R2010a\runtime\win32

 

 5.我只测试了个简单的函数,就是求和,保存文件名为add_three.m,代码如下

function [ s ] = add_three( a,b,c )

s=a+b+c;

end

6.编译成dll

matlab命令 deploytool

设置name为add,选择 C shared Library

matlab混合编程 deploytool_第1张图片

添加刚才的add_three.m文件,并编译

matlab混合编程 deploytool_第2张图片

matlab混合编程 deploytool_第3张图片

7.我是新建了个mfc的工程来测试,要设置matlab的包含目录

matlab混合编程 deploytool_第4张图片

我这里的路径是

D:\Program Files\MATLAB\R2010b\extern\include

D:\Program Files\MATLAB\R2010b\extern\lib\win32\microsoft

matlab混合编程 deploytool_第5张图片

库我添加了

libmx.lib
libeng.lib
libmat.lib
libmex.lib
mclmcrrt.lib

8,以下是测试代码

#include "add.h"
#pragma comment (lib , "add.lib" )

添加了刚才生成的dll的头文件和lib

void CtestDlg::OnBnClickedButton1()
{
    //输入
    int nrhs;
    mxArray *prhs[3];

    //输出
    int nlhs;
    mxArray *plhs[1];

    bool state;
    //double *outData;
    double *inData;
    int d = 0;

    nrhs = 3;

    if (!mclInitializeApplication(NULL, 0))
    {
        MessageBox(_T("Could not initialize mclInitializeApplication!"));
        return ;
    }

    if (!addInitialize())
    {
        MessageBox(_T("Could not initialize addInitialize!"));
        return ;
    }

    prhs[0] = mxCreateDoubleMatrix(1, 1, mxREAL);
    prhs[1] = mxCreateDoubleMatrix(1, 1, mxREAL);
    prhs[2] = mxCreateDoubleMatrix(1, 1, mxREAL);

    inData = mxGetPr(prhs[0]);
    if (inData)
    {
        inData[0] = 1;
    }

    inData = mxGetPr(prhs[1]);
    if (inData)
    {
        inData[0] = 2;
    }

    inData = mxGetPr(prhs[2]);
    if (inData)
    {
        inData[0] = 3;
    }

    nlhs = 1;

    state =mlxAdd_three(nlhs, plhs, nrhs, prhs);

    mxDestroyArray(prhs[0]);
    mxDestroyArray(prhs[1]);
    mxDestroyArray(prhs[2]);

    d = (int)mxGetScalar(plhs[0]);
    mxDestroyArray(plhs[0]);

    addTerminate();

    mclTerminateApplication();

}
 

测试后结果正确.d=6

上面的 mclInitializeApplication和 addInitialize 初始化别漏了

 

你可能感兴趣的:(matlab)