转:在VS2010下编译、调试和生成mex文件

  最近帮人调了一个程序,是网上公开的代码,利用matlab与c++混合编程做三维模型关键点检测,发现他们可以用VS2010编译、调试、生成mexw32文件,因此觉得之前在Matlab上利用mex命令真是弱爆了(非常繁琐且对于cpp文件多的根本无法用)。所以特此转载和记录如何用VS2010+matlab2012a编译生成mexw32的方法。

1.打开VS2010,新建一个win32 项目,之后选择dll,空项目,如下图:

转:在VS2010下编译、调试和生成mex文件

2.添加源文件mex1.cpp,编写mexFunction函数:

#include "mex.h"
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]){
	mexPrintf("Hello, world!
");
}

3. 配置项目属性。  

打开项目属性配置页,C++ -> 附加包含目录 加入MATLAB安装目录下的 externinclude 路径。

链接器 -> 附加库目录 加入MATLAB的 externlibwin32microsoft 路径。

链接器 -> 输入 -> 附加依赖项 输入libmx.lib libeng.lib libmat.lib libmex.lib 这四个lib文件。

在项目属性中的“预处理器”中的“预处理器定义”中添加MATLAB_MEX_FILE的宏定义。

4.添加模块文件mex1.def。

转:在VS2010下编译、调试和生成mex文件

并且为模块文件添加内容:

LIBRARY Test
EXPORTS mexFunction

5.修改生成后缀名。

转:在VS2010下编译、调试和生成mex文件

6.在启动调试时关联matlab

在项目属性---配置属性---调试---命令,中添加Matlab的启动地址:”E:Program Files (x86)MATLABR2012ainwin32MATLAB.exe”;在“工作目录”中添加mex1.mexw32文件所在的目录,我的目录是:“C:UserskyDocumentsvisual studio 2010Projectsmex1Debug”。

转:在VS2010下编译、调试和生成mex文件

7.最后设定断点,启动调试,Matlab会自动启动,再在MATLAB中输入要运行的mexw32文件,例如我在matlab运行mex1(),就会自动跳转到vs2010的断点下。

注:当我设定断点,启动调试后弹出如下错误提示框:

该提示对话框是说matlab.exe没有调试信息,不能进行调试。这是正常的,因为matlab.exe是release方式编译的,其中不可能包含调试信息,我们也不需要对其进行调试。事实上也无法通过VC调试它。对此我们直接单击OK按钮将其忽略即可。


最后列出参考的几篇关键博客:

1、http://blog.sina.com.cn/s/blog_6ec1700e0100pgtd.html

2、http://www.cnblogs.com/lukylu/p/4042306.html