现在的位置: 首页 > 综合 > 正文

Compiler_C++混合编程

2013年10月07日 ⁄ 综合 ⁄ 共 3152字 ⁄ 字号 评论关闭

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;

}

抱歉!评论已关闭.