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

18

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

3个回答

28

在参考这篇文章进行一些实验后,似乎从一个空的C++项目开始,在项目的“属性页面”中设置以下内容就足以构建出一个有效的 Visual Studio 2010 .mexw64 文件:

Configuration properties -> General:
    将目标扩展名设置为.mexw64
    将配置类型设置为动态库 (.dll)
Configureation poperties -> VC++ Directories: 在“包含目录”中添加$(MATLAB_ROOT)\extern\include;
Configuration properties -> Linker -> General: 在“附加库目录”中添加$(MATLAB_ROOT)\extern\lib\win64\microsoft;
Configuration properties -> Linker -> Input: 在“附加依赖项”中添加libmx.lib;libmex.lib;libmat.lib;
Configuration properties -> Linker -> Command Line: 在“其他选项”中添加 /export:mexFunction

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

到目前为止,这只是针对从零开始创建并构建于 Matlab 2013a 64 位版本。我认为如果需要构建32位版本,则只需将所有“64”替换为“32”。当我确认这适用于现有解决方案时,我将更新此帖子。

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

编辑 2: 根据这个问题,可以证实上述步骤也适用于 Visual Studio 2012、2013 和 2017。


它适用于Visual Studio 2015和Visual Studio 2017吗?谢谢。 - Royi
Visual Studio 2017 Pro。我在新的mex项目上完全按照说明操作,非常好用 :)。这是我在网络上找到的最简明的说明。 - Tyson Hilmer

12

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

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

步骤:

  1. 这个GitHub仓库下载属性表(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来执行此操作:

enter image description here

在“属性管理器”(从“视图”菜单中选择)中,对于每个项目的构建配置,请右键单击并选择“添加现有属性表...”,然后选择适当的属性表(32位或64位)。 (请参见下面的屏幕截图)

enter image description here

就这样了!

记住,当在MATLAB中使用您的MEX文件和在Visual Studio中构建新版本之间切换时,需要运行clear mexclear specificMEXFileName才能覆盖它。 我几乎都是用这种方式构建我的MEX文件。

更新(05/22/15):文件MATLAB.props现在支持并行计算工具箱以使用mxGPUArray对象。如果您的计算机上存在工具箱路径和库(gpu.lib),则可以使用它们。只需包括CUDA SDK“Build Customization”(如果已安装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. 设置输出文件扩展名(例如,对于x64,为.mexw64)。

不是必需的,但它还可以指定未嵌入在库中的输出清单,设置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万的里程碑:)。这个投票会帮助你达成目标!同时,这也是非常有用的信息。谢谢! - rayryeng
在 GCC 上怎么样? - Royi
@Royi https://dev59.com/NGoy5IYBdhLWcg3wcNlO#28490382 - chappjc
看起来不错。我会将其作为一条注释添加到您的回答中。谢谢(+1)! - Royi

1

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

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

我已经为Visual Studio 2010自动化了这个过程。这样,您完全可以从Visual Studio IDE中使用Mex-wrapper,还有4个额外的按钮用于调试等。编译错误会在Matlab终端窗口中回显,而不是在Visual Studio中。在此处找到上传的宏:

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


看起来你在这里发布的链接已经过时了。 - Ramesh Kadambi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接