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

j0r*_*rre 17 matlab mex visual-studio

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

Matlab 7.1+和Visual Studio 2005

使用Visual Studio编译MEX文件

如何使用CMake和Visual Studio 2010(64位)构建MATLAB R2011a(64位)mex文件?

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

j0r*_*rre 28

在对问题中提到的此页面的指导进行一些实验之后,似乎从一个空的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:根据这个问题,我可以确认上述步骤也适用于Visual Studio 2012,2013和2017.


cha*_*pjc 12

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

所有设置都可以通过属性表应用,这是一种快速应用Visual Studio项目配置的机制.

脚步:

  1. 这个GitHib仓库下载属性表(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 Project"并选择DLL,如下所示:

在此输入图像描述

  1. 在"属性管理器"(从"视图"菜单中选择)中,对于每个项目的构建配置,右键单击并选择"添加现有属性表...",然后选择相应的属性表(32位或64位).(见下面的截图)

在此输入图像描述

而已!

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

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


物业单细节

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

  1. 添加$(MATLAB_ROOT)\extern\includeAdditionalIncludeDirectories路径(使用父配置的继承路径) - mex.h的位置.
  2. 添加$(MATLAB_ROOT)\extern\lib\win64\microsoftAdditionalLibraryDirectories路径 - libmex.lib的位置等.
  3. 列出库:libut.lib;libmx.lib;libmex.lib;libmat.lib.
  4. 导出mexFunction(它是一个共享库)/EXPORT:mexFunction.
  5. 设置输出文件扩展名(例如,.mexw64对于x64).

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

为了完整起见,请注意项目配置有一个更正式的" 构建配置 "系统,其中包含一个属性表,但是松散的属性表足以设置一个简单的MEX项目.


关于 -largeArrayDims

-largeArrayDims选项是mex在MATLAB中切换到命令,仅指示不定义 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);
Run Code Online (Sandbox Code Playgroud)