我有一个包含函数库的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文件?
答案 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项目配置的机制。
步骤:
MATLAB_ROOT
,为任何32位MATLAB安装设置MATLAB32_ROOT
(例如C:\Program Files\MATLAB\R2014b\
)。此文件夹包含子目录bin,extern,sys等。如果已打开,请重新启动VS.
那就是它!
请记住,当在MATLAB中使用MEX文件和Visual Studio构建新版本时,需要运行clear mex
或clear specificMEXFileName
才能覆盖它。
我用这种方式构建了几乎所有的MEX文件。
更新(2015年5月22日):文件MATLAB.props现在支持使用mxGPUArray
对象的并行计算工具箱。如果您的计算机上存在工具箱路径和库(gpu.lib),则可以使用它们。只需包含CUDA SDK" Build Customization" (如果您已经安装了CUDA SDK并安装了Visual Studio集成,则应该安装)以包含cuda_runtime.h等。最后,链接cudart_static.lib(但保持继承...已选中,否则您将获得其他链接器错误)。
属性表详细信息
属性表中只有几个重要设置:
$(MATLAB_ROOT)\extern\include
添加到AdditionalIncludeDirectories
路径(使用父配置中的继承路径) - mex.h的位置。$(MATLAB_ROOT)\extern\lib\win64\microsoft
添加到AdditionalLibraryDirectories
路径 - libmex.lib等的位置libut.lib;libmx.lib;libmex.lib;libmat.lib
。mexFunction
(它是共享库):/EXPORT:mexFunction
。.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 :(得分:1)
用于构建/链接/编译,使用扩展或宏来自动化Visual Studio
我已经为visual studio 2010实现了自动化。这样,您可以完全使用Visual Studio IDE中的mex-wrapper,有4个额外的按钮用于调试等。编译错误从matlab终端窗口而不是Visual中回显工作室。找到上传的宏: