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
添加刚才的add_three.m文件,并编译
7.我是新建了个mfc的工程来测试,要设置matlab的包含目录
我这里的路径是
D:\Program Files\MATLAB\R2010b\extern\include
D:\Program Files\MATLAB\R2010b\extern\lib\win32\microsoft
库我添加了
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 初始化别漏了