如何在Visual Studio中直接构建mex文件?

时间:2013-05-23 14:37:13

标签: matlab visual-studio mex

我有一个包含函数库的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文件?

3 个答案:

答案 0 :(得分:27)

在对问题中提到的this page的指导进行一些实验之后,似乎从一个空的C ++项目开始,项目的属性页中的以下设置是必要的,足以从Visual Studio 2010构建一个工作的.mexw64 :

Configuration properties -> General:
    Set Target Extension to .mexw64
    Set Configuration Type to Dynamic Library (.dll)

Configureation poperties -> VC++ Directories:
    Add $(MATLAB_ROOT)\extern\include; to Include Directories

Configuration properties -> Linker -> General:
    Add $(MATLAB_ROOT)\extern\lib\win64\microsoft; to Additional Library Directories

Configuration properties -> Linker -> Input:
    Add libmx.lib;libmex.lib;libmat.lib; to Additional Dependencies

Configuration properties -> Linker -> Command Line:
    Add /export:mexFunction to Additional Options

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

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

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

编辑2:关注this question我可以确认上述步骤也适用于Visual Studio 2012,2013和2017。

答案 1 :(得分:12)

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

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

步骤:

  1. this GitHib repo下载属性表(MATLAB.props)。 它简短而甜蜜。我实际上是敦促你自己去了解这个过程中涉及的内容。有关说明,请参阅下面的“属性表详细信息”部分。
  2. 为64位MATLAB安装设置MATLAB根环境变量:MATLAB_ROOT,为任何32位MATLAB安装设置MATLAB32_ROOT(例如C:\Program Files\MATLAB\R2014b\)。此文件夹包含子目录bin,extern,sys等。如果已打开,请重新启动VS.
  3. 在Visual Studio中创建一个空DLL项目,可选择创建x64解决方案平台。通过选择" Win32 Project"来做到这一点。并按如下方式选择DLL:
  4. enter image description here

    1. 在"物业经理" (从“视图”菜单中选择),对于每个项目的构建配置,右键单击并选择"Add Existing Property Sheet...",然后选择相应的属性表(32位或64位)。 (见下面的截图)
    2. enter image description here

      那就是它!

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

      更新(2015年5月22日):文件MATLAB.props现在支持使用mxGPUArray对象的并行计算工具箱。如果您的计算机上存在工具箱路径和库(gpu.lib),则可以使用它们。只需包含CUDA SDK" Build Customization" (如果您已经安装了CUDA SDK并安装了Visual Studio集成,则应该安装)以包含cuda_runtime.h等。最后,链接cudart_static.lib(但保持继承...已选中,否则您将获得其他链接器错误)。


      属性表详细信息

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

      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. 设置输出文件扩展名(例如x64的.mexw64)。
      6. 不是必需的,但它还指定了一个未嵌入库中的输出清单,设置了MATLAB_MEX_FILE,并开启了分析所需的数据生成。

        为了完整起见,请注意有一个更正式的" build configuration"项目配置系统,包括一个属性表,但松散的属性表足以设置一个简单的MEX项目。


        关于-largeArrayDims

        的说明

        -largeArrayDims选项是在MATLAB中切换到mex命令,只是指示不定义 MX_COMPAT_32。因此,在Visual Studio中,您不必执行任何操作,因为默认情况下未定义此操作。如果您想要相反的行为(-compatibleArrayDims),请在预处理器部分中定义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);
        

答案 2 :(得分:1)

用于构建/链接/编译,使用扩展或宏来自动化Visual Studio

  1. 启动一个瘦的Matlab客户端(使用-nojvm -noawt -nodesktop -nosplash命令行选项,这在我的机器上启动不到一秒钟)
  2. 通过调用mex(包括其他依赖项等)来生成二进制文件。
  3. 如果激活了调试,则将visual studio调试器附加到新启动的瘦matlab客户端(您在VS中单击的任何断点都将处于活动状态)。
  4. 我已经为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