配置vs2013 编辑mex文件

最近要用vs来编辑mex文件,但是在配置vs2013的过程碰到了一点问题,考虑到一些人可能也会遇到相同的问题,所以分享一下我配置vs2013的过程、碰到的问题以及解决方案。


创建MEX文件

  • 创建一个DLL工程

     MEX程序实际上是一个动态链接库(DLL),其输出函数是MEX文件的入口函数mexFunction。

     创建一个MFC DLL工程,并命名为mexDemo2

防止Matlab与系统DLL文件冲突,最好将Dll的类型设置为静态连接方式

  • 设置输出函数

成功创建MFC DLL工程后,在Source Files目录内会生成一个mexDemo2.def文件,打开此文件,在EXPORTS相中添加mexFunction一行,设置后的mexDemo2.def文件内容如下
; mexDemo2.def :  Declares the module parameters for the DLL.LIBRARYEXPORTS ; Explicit exports can go heremexFunction

  • 添加应用程序代码

创建C++源文件,步骤和一般的C++程序类似,不过在所有的源文件中必须要包含有mexFunction函数(可没有main函数),如:
#include "stdafx.h"
#include "mex.h"
void mexFunction(int nlhs, mxArray* plhs[], int nrhs, mxArray* prhs[])
{
mexPrintf("Hello");
}

  • 设置编译器

因为工程中用到了mexPrintf等Matlab库函数,所以要正确编译Mex函数,还需要告诉编译器这些Matlab库函数在哪里,以什么方式链接


1)添加include路径:

在工程目录下,打开工程属性设置对话框。在“配置属性”(Configuration Properties") -〉“C++" -〉”常规“(General)属性页,在”附加包含目录“(Additional Include Directories)选项中添加Matlab外部接口的include目录:“Matlab安装目录\extern\include"
配置vs2013 编辑mex文件_第1张图片

2) 添加lib路径

打开“配置属性”(Configuration Properties") -〉“链接器"(Linker) -〉”常规“(General)属性页,在”附加库目录“(Additional Library Directories)选项中添加Matlab外部接口对应的链接库目录:“Matlab安装目录\extern\lib\win32\microsoft"
对于64位Matlab,win32对应于win64.
配置vs2013 编辑mex文件_第2张图片

3)添加必须的链接库

这些必须的链接库是vs与Matlab的接口,链接时先扫描这些链接库。

打开“配置属性”(Configuration Properties") -〉“链接器"(Linker) -〉”输入“(Input)属性页,在”附加依赖项“(Additional Dependencies)选项中添加: libmx.lib;libeng.lib;libmex.lib;libmat.lib. 
注意这些文件名必须用分号分割,否则会出错:
cannot open file "libmx.lib libeng.lib libmex.lib libmat.lib"
配置vs2013 编辑mex文件_第3张图片

4) 指定链接库类型

vs包含有不同版本的链接库,这些链接库在部分功能上是不同的,在链接的时候需要指明使用哪个链接库。这里需要使用MD类型的动态链接库, 否则编译的时候可能会报错,并提示使用/MD链接库

打开在“配置属性”(Configuration Properties") -〉“C++" -〉”代码生成“(Code Generation)属性页,在"运行时库“(Running Library)中选中/MD

至此,编译器的配置已经完成了。

  • 编译

直接使用vs2013中的编译器进行编译,编译成功后会在工程目录下的debug目录中声称mexDemo2.dll文件,为了与高版本的Matlab匹配可以将dll文件后缀改为mexw32,但是修改之后再次编译的话不会覆盖mexw32文件而是重新生成一个dll文件,这给调试带来一定的麻烦, 修改vs的输出类型为mexw32:

打开在“配置属性”(Configuration Properties") -〉“链接"(Linker) -〉”输出文件“(Output File)属性,将输出扩展名改为mexw32

则编译后生成的是mexw32文件。

  • 调试

在没有打开Matlab的情况下,设置 ”调试“(debugging)选项下的Command值,可以在调试的时候启动Matlab,终止调试时关闭Matlab,如下图
配置vs2013 编辑mex文件_第4张图片

然而这种方法就是个鸡肋,并没有什么卵用。

可以直接打开Matlab,添加debug路径,打开vs的tools工具栏,选择”连接进程“(Attach to Process),选中Matlab.exe进程,完成进程之间的链接。在vs中设置断点,然后在Matlab里面调用dll文件,此时vs中的断点对程序是有效的。

每次修改MexFunction所在的.cpp文件后,重新编译生成解决方案前都需要先在matlab工程下clear一下,即
                      clear (ProjectName).mexw32
注意:这步非常重要,因为matlab在调用该mex函数后还一直占用,未释放,必须要clear下,vs中才可重新编译生成解决方案,否则编译的时候会提示文件不能打开以进行链接


你可能感兴趣的:(C++,matlab,VS2013)