使用 Visual Studio 编译时的 MEX 选项
Posted
技术标签:
【中文标题】使用 Visual Studio 编译时的 MEX 选项【英文标题】:MEX options when compiling with Visual Studio 【发布时间】:2014-09-23 15:01:59 【问题描述】:由于某些原因,我必须在 Visual Studio 环境下编译 MEX 文件。有很多教程,我的 MEX 文件运行良好。但是,有几个MEX选项,比如mex
选项中的-largeArrayDims
,在VS环境下不知道在哪里开启。谁能提供帮助?
【问题讨论】:
【参考方案1】:-largeArrayDims
选项是对 MATLAB 中mex
命令的切换,它只是表示不定义MX_COMPAT_32
。因此,在 Visual Studio 中,您无需执行任何操作,因为默认情况下未定义。如果您想要相反的行为 (-compatibleArrayDims
),则在 Preprocessor 部分定义 MX_COMPAT_32
。来自 tmwtypes.h:
tmwtypes.h
#ifdef MX_COMPAT_32
typedef int mwSize;
typedef int mwIndex;
typedef int mwSignedIndex;
#else
typedef size_t mwSize; /* unsigned pointer-width integer */
typedef size_t mwIndex; /* unsigned pointer-width integer */
typedef ptrdiff_t mwSignedIndex; /* a signed pointer-width integer */
#endif
一般来说,使用属性表来设置构建 MEX 文件所需的所有设置(库依赖项、标题、MEX 文件扩展名等)很方便。可在at GitHub 找到自动适用于 32 位或 64 位 MATLAB 的单个属性表。
在属性管理器中为MEX项目的每个构建配置添加属性表(右键单击Debug | x64
等配置并选择“添加现有属性表”。见this post for detailed instructions。
一些补充说明:
-
我更喜欢使用
/EXPORT:mexFunction
而不是.def 文件。使用单个导出函数,这要简单得多。
属性表制作一个清单文件,但实际上没有必要。
我包含了 libut.lib,它提供了一些很好的函数来检测 MEX 文件中的中断 (CTRL-C)。相关声明(虽然这里离题了):
// prototype the break handling functions in libut (C library)
extern "C" bool utIsInterruptPending();
extern "C" void utSetInterruptPending(bool);
【讨论】:
谢谢,这很有帮助。所以过程是,我制作一个 XML 文件并将其合并到配置中? mex 命令在调用 CL 编译器(或链接器)时是否执行相同的过程? @JasonYuan 文件的内容是XML,是的,但应该保存with a .props extension
。 mex
命令本质上以相同的方式配置构建(编译和链接)。只需在运行mex
时尝试-v
开关即可查看使用的不同命令行。这些属性表设置为在 Visual Studio 中执行相同的操作。以上是关于使用 Visual Studio 编译时的 MEX 选项的主要内容,如果未能解决你的问题,请参考以下文章
无法将 matlab.exe 进程附加到 Visual Studio 2013 以调试 mex 文件?
如何使用 Visual Studio 2010 调试 MATLAB .mex32/.mex64 文件
Matlab 中的 Visual Studio 2012 编译器更新