mbuild -setup
mcc -m fun1.m
针对我的项目:matlab_compiler2.
一.
class_Mfunc.m文件的源码:
function [maxf minf] = class_Mfunc(f1,f2)
t = linspace(0,1,400);
y1 = sin(2*pi*f1*t);
y2 = cos(2*pi*f1*t);
plot(t,y1);
figure %分开画出第二条曲线
plot(t,y2);
maxf = max(f1,f2)
minf = min(f1,f2)
end
>> mbuild –setup
>> mcc -l class_Mfunc.m %-l不是数字1,初学者很容易出错。
二.
1.把编译生成的class_Mfunc.dll , class_Mfunc.lib , class_Mfunc.h拷贝到VS的当前工作目录中。(.lib与.dll文件的区别请参考”DLL和LIB.doc”,要想知道链接库(class_Mfunc.dll , class_Mfunc.lib)的内容,可查看编译生成的class_Mfunc.c文件)。
2.查看class_Mfunc.h
#include"mclmcrrt.h"
externLIB_class_Mfunc_C_API
boolMW_CALL_CONVclass_MfuncInitialize(void);//初始化
externLIB_class_Mfunc_C_API
voidMW_CALL_CONVclass_MfuncTerminate(void);//结束
externLIB_class_Mfunc_C_APIboolMW_CALL_CONVmlfClass_Mfunc(intnargout,mxArray**maxf,mxArray**minf,mxArray*f1,mxArray*f2);//nargout是输出参数的个数,mxArray**maxf,mxArray**minf表示输出参数,mxArray*f1,mxArray*f2表示输入参数
3.由于有#include"mclmcrrt.h",所以需要包含mclmcrrt.h这个头文件的相应路径到当前工作目录中。
a.项目-》属性-》VC++目录-》包含目录(加入mclmcrrt.h头文件路径)
D:\Program Files\MATLAB\R2011b\extern\include
b. 项目-》属性-》VC++目录-》库目录-》(加入mclmcrrt.lib库文件的路径)
D:\Program Files\MATLAB\R2011b\extern\lib\win32\microsoft
C.链接器-》输入-》附加依赖项:输入mclmcrrt.lib;class_Mfunc.lib
*因为class_Mfunc.lib已经拷贝到当前工作的目录中,所以不需要把它的路径包含到“库目录”中,直接在“附加依赖项”中输入class_Mfunc.lib,class_Mfunc.lib对应的头文件也在当前工作目录中,所以也不需要“包含目录”,到时候直接在源文件中引include class_Mfunc.h即可。目录的配置参见MatCom_C++.docx。
三.编程
1.包含头文件#include"class_Mfunc.h"
//#include <mclmcrrt.h>//"class_Mfunc.h"包含了mclmccr.h
2.在XXDlg类中的OnIniDialog()进行库的初始化
BOOL CClass_Compiler2Dlg::OnInitDialog()
{
// TODO: 在此添加额外的初始化代码
//调用matlab动态链接库前,需要先初始化
//表示如果初始化失败了,整个程序应该返回,并弹出消息框。针对mclmcrrt.lib
if (!mclInitializeApplication(NULL,0))
{
MessageBox("Could not initialize the application !");
return FALSE;
}
//在调用编译的动态链接库之前,需要对这个库进行初始化。在头文件中可以查看到这个函数。/如果这个函数调用失败的话,需要弹出消息框,并返回。针对 class_Mfunc.lib
if (!class_MfuncInitialize())
{
MessageBox("Could not initialize the library !");
}
return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}
3.添加XXDlg类的WM_CLOSE消息响应函数,因为初始化函数与结束函数是成对出项的。
void CClass_Compiler2Dlg::OnClose()
{
class_MfuncInitialize();
mclTerminateApplication();
CDialogEx::OnClose();
}
4.添加按钮点击的函数。
void CClass_Compiler2Dlg::OnBnClickedOk()
{
double fValue1 = 1.0;
double fValue2 = 2.0;
mxArray *f1;
mxArray *f2;
//一定要给*maxf和*minf赋为NULL否则这两个指针会指向同一块内存,引起出错。
mxArray *maxf = NULL;
mxArray *minf = NULL;
//建立一个1*1的矩阵,即只有一个值的矩阵。
f1 = mxCreateDoubleMatrix(1,1,mxREAL);
f2 = mxCreateDoubleMatrix(1,1,mxREAL);
//给f1,f2这两个指针分别指向fValue1和fValue2.
memcpy(mxGetPr(f1),&fValue1,sizeof(double));
memcpy(mxGetPr(f2),&fValue2,sizeof(double));
//调用函数 mlfClass_Mfunc(int nargout, mxArray** maxf, mxArray** minf, mxArray* f1, mxArray* f2);可见mxArray** maxf, mxArray** minf 是两个*的,所以要用取地址符。
mlfClass_Mfunc(2,&maxf,&minf,f1,f2);
//等待用户关闭图形窗口,图形窗口关闭后,函数返回,继续执行下面的语句
mclWaitForFiguresToDie(NULL);
//销毁指针变量
mxDestroyArray(f1);
f1 = NULL;
mxDestroyArray(f2);
f2 = NULL;
mxDestroyArray(maxf);
maxf = NULL;
mxDestroyArray(minf);
minf = NULL;
}