使用 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 extensionmex 命令本质上以相同的方式配置构建(编译和链接)。只需在运行mex 时尝试-v 开关即可查看使用的不同命令行。这些属性表设置为在 Visual Studio 中执行相同的操作。

以上是关于使用 Visual Studio 编译时的 MEX 选项的主要内容,如果未能解决你的问题,请参考以下文章

无法将 matlab.exe 进程附加到 Visual Studio 2013 以调试 mex 文件?

如何使用 Visual Studio 2010 调试 MATLAB .mex32/.mex64 文件

Visual Studio 中的配置文件 mex 功能

Matlab 中的 Visual Studio 2012 编译器更新

为 MATLAB 使用 Visual Studio 2013 的 C 编译器

Visual Studio sizeof() IntelliSense 与编译时的区别