如何在 VC++60 环境中编译与调试 mex 程序.docx
《如何在 VC++60 环境中编译与调试 mex 程序.docx》由会员分享,可在线阅读,更多相关《如何在 VC++60 环境中编译与调试 mex 程序.docx(10页珍藏版)》请在冰豆网上搜索。
如何在VC++60环境中编译与调试mex程序
如何在VC++6.0环境中编译与调试mex程序
注:
1.vc调试mex,直接从第三步开始即可。
2.完成后,直接编译(compile)会出错,先用build(组建),就没有错误了。
若还有错,尝试:
(1).把debug文件夹清空后再试
(2).加如def文件后面的“mexFunction”—变成—“;mexFunction”后再build。
Build通过后,去掉分号“;“。
1、编写Matlab函数
函数文件sum_prod.m,内容如下:
function[sum,prod]=sum_prod(p1,p2)
sum=p1+p2;%p1与p2的和
prod=p1.*p2;%p1与p2的点乘
该函数完成的是矩阵的求和与点乘的功能,下面将介绍把该代码转换成C++环境可用的代码的方法。
2、Matlab6.5编译器设置
(1)在同一台电脑上安装Matlab6.5和VisualC++6.0;
(2)mex命令设置
(a)运行Matlab,在Matlab的命令窗口(CommandWindow)键入“mex-setup”命令后,按回车键,安装Matlab编译器;
(b)命令窗口出现如下提示:
Pleasechooseyourcompilerforbuildingexternalinterface(MEX)files:
Wouldyoulikemextolocateinstalledcompilers[y]/n?
此时键入”y”,按回车;
(c)命令窗口出现如下提示:
Pleasechooseyourcompilerforbuildingexternalinterface(MEX)files:
Wouldyoulikemextolocateinstalledcompilers[y]/n?
y
Selectacompiler:
[1]DigitalVisualFortranversion6.0inC:
\ProgramFiles\MicrosoftVisualStudio
[2]LccCversion2.4inC:
\MATLAB6P5\sys\lcc
[3]MicrosoftVisualC/C++version6.0inC:
\ProgramFiles\MicrosoftVisualStudio
[0]None
此时键入”3”,按回车;选择MicrosoftVisualC++6.0的编译器
(d)命令窗口出现如下提示:
Pleaseverifyyourchoices:
Compiler:
MicrosoftVisualC/C++6.0
Location:
C:
\ProgramFiles\MicrosoftVisualStudio
Arethesecorrect?
([y]/n):
此时键入”y”,按回车;确认选择MicrosoftVisualC++6.0的编译器
3、建立MFC动态链接工程
(1)建立一个名为sum_prod的MFC动态链接工程,如下图所示
(2)单击OK按钮,出现如下对话框,选择使用静态链接MFC的DLL,如下图如示,其它采用默认设置。
(3)在Sample目录下会生成sum_prod.cpp和sum_prod.def这两个文件。
4、VC++6.0环境及工程设置
在上面的VC工程中,进行以下设置
(1)VC++6.0环境设置
单击菜单Tools,出现如下菜单
单击Options…菜单项,出现Options对话框,选择Directories标签,在includefiles里面加入:
C:
\MATLAB6P5\EXTERN\INCLUDE
如下图所示
在Libraryfiles里面加入:
C:
\MATLAB6P5\EXTERN\LIB\WIN32\MICROSOFT\MSVC60
如下图所示
(2)VC++6.0工程设置
单击菜单Project,出现如下菜单
单击Setting…菜单项,出现ProjectSetting对话框,选择Link标签,在Object/librarymodules:
下面的文本框内容的后面加入libmx.liblibmex.liblibmatlbmx.liblibmat.lib,如下图所示
设置完成。
5、添加mexFunction函数代码
(1)打开sum_prod.def文件,在“EXPORTS”后面加入mexFunction一行,声明mexFunction函数为导出函数,下面是编辑后的sum_prod.def文件内容
(2)打开sum_prod.cpp文件,在该文件尾部添加mexFunction函数代码。
也可以将mexFunction函数代码用另外一个cpp文件保存,在每个文件的开始应加上这一行
#include"stdafx.h"
(3)与第1步Maltab函数相对应的mexFunction函数代码如下:
#include"mex.h"//mx,mex函数头文件
//定义输入参数
#defineP1prhs[0]
#defineP2prhs[1]
//定义输出参数
#defineSUMplhs[0]
#definePRODplhs[1]
//定义C运算函数
voidSUM_PROD_RUN(double*sum,
double*prod,
double*p1,
double*p2,
intm1,
intn1)
{
//C源程序代码
inti;
for(i=0;i{
sum[i]=p1[i]+p2[i];
prod[i]=p1[i]*p2[i];
}
}
void
mexFunction(intnlhs,mxArray*plhs[],//输出参数个数,及输出参数数组
intnrhs,constmxArray*prhs[])//输入参数个数,及输入参数数组
{
intm1,n1,m2,n2;
double*p1,*p2,*sum,*prod;
//取得输出矩阵的行列数
m1=mxGetM(P1);
n1=mxGetN(P1);
m2=mxGetM(P2);
n2=mxGetN(P2);
//输入矩阵的行列数必须相等
if(m1!
=m2||n1!
=n2)
mexErrMsgTxt("Thesizeofinputmatrixmustbeequal!
\n");
//为输出变量分配内存空间
SUM=mxCreateDoubleMatrix(m1,n1,mxREAL);
PROD=mxCreateDoubleMatrix(m1,n1,mxREAL);
//取得输入参数指针
p1=mxGetPr(P1);
p2=mxGetPr(P2);
//取得输出参数指针
sum=mxGetPr(SUM);
prod=mxGetPr(PROD);
//调用C运算函数
SUM_PROD_RUN(sum,prod,p1,p2,m1,n1);
return;
}
(4)编译链接程序后,可以在Debug目录得到sum_prod.dll,该DLL就是Matlab环境中可直接调用的C语言mex函数
6、mexFunction函数调试
(1)在VC++6.0中以Debug方式建立以上sum_prod工程
(2)单击菜单Project,出现如下菜单
单击Setting…菜单项,出现ProjectSetting对话框,选择Debug标签,在Executablefordebugsession:
下面的文本框内容的后面加入matlab.exe的完整路径名,如下图所示
接OK按钮。
(3)在mexFunction源程序中合适的设置断点,然后按F5键进入调试过程。
(4)进入调试过程后,就会启动一个新的Matlab程序,这个Matlab程序的当前目录为该工程所在的位置,为了运行sum_prod.dll,需要将当前目录设置为Debug目录。
(5)在Matlab命令窗口调用sum_prod.dll,程序就会停在VC++6.0环境里的程序断点处。
此时可以在Context窗口中看到最近处理的变量数值,并可以随意添加Watch。
这样就可以像调试通常的C程序一样对mex程序进行调试,如下图所示。
7、mexFunction函数测试
(1)运行Matlab6.5,将sum_prod.dll复制到Matlab当前目录
(2)在Matlab6.5命令窗口输入以下代码
“p1=[12;34];p2=[56;78];[sum,prod]=sum_prod(p1,p2)”
按回车键,得到
sum=
68
1012
prod=
512
2132
表明sum_prod.dll测试成功!