在Visual Studio中开发Matlab mex文件,生成mexw64/mexw32
csunking贡献,2015-9-22 1712
1、 概述
通过使用C/C++与Matlab混合编程,既可以享受到C代码快速执行的速度,又可以方便的使用Matlab众多的库函数和强大的绘图功能。让Matlab调用C函数是通过DLL文件实现的,而这个DLL的开发过程不仅仅可以使用Matlab自带的mex命令,还可以使用VC++开发环境,使用VC有很多好处,一是让我回到了原来熟悉的开发环境中,二能够使用更加标准的C++编译器,第三点也是最爽的,可以使用VC强大的调试功能。
此次文档更新时使用的开发环境为:Visual Studio 2012, Matlab R2015a
2、 步骤
1.启动VS,新建一个空的项目ATSRID。然后配置项目属性信息。然后,新建一个.cpp文件atsrid.cpp。并在添加Preprocessor Definitions中添加MATLAB_MEX_FILE的宏定义。
将输出文件的后缀名改为mexw64/mexw32
$(OutDir)$(TargetName).mexw64
配置项目生成程序的平台位数属性
2. 为matlab函数提供头文件和静态库的支持
包含目录:
E:\Program Files\MATLAB\R2015a\extern\include
E:\Program Files\MATLAB\R2015a\extern\include\win64
库目录
E:\Program Files\MATLAB\R2015a\extern\lib\win64\microsoft
连接器中添加静态链接库文件
libmx.lib;libmat.lib;libmex.lib;
3. 在atsrid.cpp中编写mex文件中的内容。然后用利用.def文件导出mexFunction函数。
#include "mex.h" void mexFunction(int nlhs,mxArray *plhs[],int nrhs,const mxArray *prhs[]) { int nlhs1,nrhs1; mxArray *plhs1[1],*prhs1[1]; mxArray *array_ptr; nlhs1=1; nrhs1=1; if((array_ptr=mexGetVariable("base","x"))==NULL) //"base" means the command window where { //we get the matrix "x". mexErrMsgTxt("Variable 'x' not in the workspace."); } else { prhs1[0]=array_ptr; mexCallMATLAB(nlhs1,plhs1,nrhs1,prhs1,"det"); mexPrintf("Det(array_ptr) == %g\n",mxGetScalar(plhs1[0])); } }
让函数从DLL中的导出有两种方法,__declspec(dllexport)命令导出和def文件导出,但由于需要导出mexFunction在”mex.h”中已经定义,所以前一种导出方法行不通,这里采用def文件导出。
首先告诉编译器我使用了xx.def文件,然后再在文件中加入内容。通过上述方式定义的def文件会自动添加入下面的属性中。
文件中的内容如下
LIBRARY ATSRID; 指的是模块名称(可以用新建的项目名称)
EXPORTS mexFunction
4. 编译运行,生成ATSRID.mexw64文件。然后将该文件拷贝到Matlab的当前目录下,然后进行该模块的测试
x=magic(100);
ATSRID();
可以将结果与det(x)得到的相比较,查看是否正确。
备注:在VS项目中的atsrid.cpp可以直接放在matlab的当前目录下进行mex atsrid.cpp编译,也同样可以生成atsrid.mexw64。之所以在Visual C++中进行编译,是因为方便调试该程序。下面也将介绍另外一种调试方法。
3、 采用VS Debug mex文件
方便对各位在matlab上的researcher or developer。
1、初次使用mex时需要配置配置matlab mex编译器
mex -setup
2、接下来,用-g选项编译mex源文件,-g表示编译结果中包含调试信息。
mex -g atsrid.cpp
3、开启Visual Studio,不要关闭你的matlab。在Visual Studio的工具菜单中,选择关联到一个进程。
Visual Studio会加载数据,在弹出的对话框中选择,选择matlab进程,点击“关联”。
4、首先在Visual Studio的ATSRID项目中的atsrid.cpp文件代码处添加断点。然后,打开matlab 放置atsrid.mexw64的当前目录,在代码行中输入下面的代码
x=magic(10);
atsrid();
之后,会发现Visual Studio会自动将程序运行到断点出,等待下一步的操作。
当断点被触发了,你就可以利用Visual Studio来查看你的变量,内存,调试你的程序了。
引用
似水流年,2009,http://knhunter.blogbus.com/.
没有整理与归纳的知识,一文不值!高度概括与梳理的知识,才是自己真正的知识与技能。 永远不要让自己的自由、好奇、充满创造力的想法被现实的框架所束缚,让创造力自由成长吧! 多花时间,关心他(她)人,正如别人所关心你的。理想的腾飞与实现,没有别人的支持与帮助,是万万不能的。