【问题标题】:How to build mex file directly in Visual Studio?如何直接在 Visual Studio 中构建 mex 文件?
【发布时间】:2013-05-18 23:36:35
【问题描述】:

我有一个包含函数库的 Visual Studio 2010 解决方案,我希望能够使用 MATLAB 作为该库的几个可能的前端之一。因此,我希望 Visual Studio 在我构建解决方案时自动生成一个 mex 文件,而不必将我的所有构建选项和路径导出到 mexopts.bat 并打开 MATLAB 以从那里构建文件。我已经看到了一些实现类似目标的建议,例如在这些帖子中:

Matlab 7.1+ and Visual Studio 2005

Compiling a MEX file with Visual Studio

How to use CMake and Visual Studio 2010 (64 bit) to build a MATLAB R2011a (64 bit) mex file?

但是,它们要么看起来有点过时(引用不再被发现的文件),要么使用外部工具(例如 CMake)。有谁知道如何在 Visual Studio(2010 及更新版本)中设置一个新项目(在现有解决方案中),该项目将为当代 MATLAB 版本构建一个 mex 文件?

【问题讨论】:

    标签: matlab visual-studio mex


    【解决方案1】:

    在问题中提到的this page 的指导下进行了一些试验后,似乎从一个空的 C++ 项目开始,项目属性页中的以下设置对于从 Visual Studio 2010 构建一个工作的 .mexw64 是必要且足够的: 配置属性 -> 常规: 将目标扩展名设置为 .mexw64 将配置类型设置为动态库 (.dll) 配置属性 -> VC++ 目录: 添加 $(MATLAB_ROOT)\extern\include;包括目录 配置属性 -> 链接器 -> 常规: 添加 $(MATLAB_ROOT)\extern\lib\win64\microsoft;到其他图书馆目录 配置属性 -> 链接器 -> 输入: 添加 libmx.lib;libmex.lib;libmat.lib;附加依赖项 配置属性 -> 链接器 -> 命令行: 将 /export:mexFunction 添加到附加选项

    $(MATLAB_ROOT) 是 Matlab 根文件夹的路径,例如。 C:\Program Files\MATLAB\R2013a.

    到目前为止,这只是从从头开始创建并为 Matlab 2013a 64 位构建的解决方案中尝试过的。我假设要为 32 位构建一个只需要将两个 64 更改为 32。当我确认这适用于现有解决方案时,我会更新帖子。

    编辑:正如预期的那样,这适用于添加到现有解决方案的项目。请记住将新项目设置为依赖于创建库的项目。

    编辑 2:this question 之后,我可以确认上述步骤在 Visual Studio 2012、2013 和 2017 中也适用。

    【讨论】:

    • 它是否适用于 Visual Studio 2015 和 Visual Studio 2017?谢谢。
    • Visual Studio 2017 专业版。在一个新的 mex 项目中,我完全按照说明进行操作。效果很好:)。这是我在网上找到的最简洁的说明。
    【解决方案2】:

    使用属性表为 MEX 文件快速设置 Visual Studio 项目

    所有设置都可以通过 property sheets 应用,这是一种快速应用 Visual Studio 项目配置的机制。

    步骤:

    1. this GitHib repo 下载属性表 (MATLAB.props)。 它又短又甜。我实际上敦促您自己制作以了解该过程中涉及的内容。有关说明,请参阅下面的“属性表详细信息”部分。
    2. 设置 MATLAB 根环境变量:MATLAB_ROOT 用于 64 位 MATLAB 安装,MATLAB32_ROOT 用于任何 32 位 MATLAB 安装(例如 C:\Program Files\MATLAB\R2014b\)。此文件夹包含子目录 bin、extern、sys 等。如果 VS 已打开,请重新启动它。
    3. 在 Visual Studio 中创建一个空的 DLL 项目,可选择创建一个 x64 解决方案平台。通过选择“Win32 项目”并选择 DLL 来执行此操作,如下所示:

    1. 在“Property Manager”(从 View 菜单中选择)中,对于每个项目的构建配置,右键单击并选择 "Add Existing Property Sheet...",然后选择适当的属性表(32 位或 64 位)。 (见下方截图)

    就是这样!

    请记住,在 MATLAB 使用 MEX 文件和 Visual Studio 构建新版本之间时,需要运行 clear mexclear specificMEXFileName 才能覆盖它。 我用这种方式构建了几乎所有的 MEX 文件。

    更新 (05/22/15):文件 MATLAB.props 现在支持并行计算工具箱以使用 mxGPUArray 对象。如果您的机器上存在工具箱路径和库 (gpu.lib),则可以使用它们。只需包含 CUDA SDK“构建自定义”(如果您已安装 CUDA SDK 并安装了 Visual Studio 集成,则应安装)以包含 cuda_runtime.h 等。最后,与 cudart_static.lib 链接(但保留 Inherit.. . 检查,否则您将收到其他链接器错误)。


    属性表详细信息

    属性表中只有几个重要的设置:

    1. $(MATLAB_ROOT)\extern\include 添加到AdditionalIncludeDirectories 路径(具有从父配置继承的路径)- mex.h 的位置。
    2. $(MATLAB_ROOT)\extern\lib\win64\microsoft 添加到AdditionalLibraryDirectories 路径——libmex.lib 的位置等。
    3. 列出库:libut.lib;libmx.lib;libmex.lib;libmat.lib
    4. 正在导出mexFunction(它是一个共享库):/EXPORT:mexFunction
    5. 设置输出文件扩展名(例如,.mexw64 用于 x64)。

    没有必要,但它还指定了一个未嵌入库中的输出清单,设置MATLAB_MEX_FILE,并打开生成分析所需的数据。

    为了完整起见,请注意有一个更正式的“build configuration”系统用于项目配置,其中包括一个属性表,但对于设置简单的 MEX 项目来说,一个松散的属性表就足够了。


    关于-largeArrayDims的说明

    -largeArrayDims 选项是对 MATLAB 中mex 命令的切换,它只是表示不定义 MX_COMPAT_32。因此,在 Visual Studio 中,您无需执行任何操作,因为默认情况下未定义。如果您想要相反的行为 (-compatibleArrayDims),请在 Preprocessor 部分定义 MX_COMPAT_32


    libut.lib 有什么用?

    我包含了 libut.lib,它提供了一些很好的函数来检测 MEX 文件中的中断 (CTRL-C)。相关声明(虽然这离题了):

    // prototype the break handling functions in libut (C library)
    extern "C" bool utIsInterruptPending();
    extern "C" void utSetInterruptPending(bool);
    

    【讨论】:

    • 请允许我祝贺你获得 20k :)。这个投票应该会让你到达那里!此外,非常有用的信息。谢谢!
    • 在 GCC 上怎么做?
    • 看起来不错。我会将其作为注释添加到您的答案中。谢谢(+1)!
    【解决方案3】:

    对于构建/链接/编译,使用扩展或宏来自动化视觉工作室

    1. 启动瘦 Matlab 客户端(使用 -nojvm -noawt -nodesktop -nosplash 命令行选项,在我的机器上不到一秒即可启动)
    2. 通过调用 mex(包括其他依赖项等)生成二进制文件。
    3. 如果调试已激活,请将 Visual Studio 调试器附加到您新启动的瘦 matlab 客户端(您在 VS 中单击的任何断点都将处于活动状态)。

    我已为 Visual Studio 2010 自动执行此操作。这样,您可以完全从 Visual Studio IDE 使用 mex-wrapper,有 4 个额外的按钮用于调试等。编译错误从 matlab 终端窗口而不是在 Visual 中回显工作室。在此处找到上传的宏:

    http://www.mathworks.se/matlabcentral/fileexchange/39549-visual-studio-toolbar-for-mex-interface-with-video-tutorial

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-01-17
      • 1970-01-01
      • 1970-01-01
      • 2018-04-13
      • 2013-10-29
      • 1970-01-01
      • 2010-09-29
      相关资源
      最近更新 更多