MATLAB 设置 Windows 下 MEX 编译环境

MATLAB 可以调用由 C/C++ 或 FORTRAN 语言文件编译生成的二进制 MATLAB 可执行文件(MEX, MATLAB executable)。与普通的 C/C++/FORTRAN 不同,MEX 源文件需要额外设置 gateway 函数来对接 MATLAB。Mathworks 也提供了相关的头文件,提供了一些数据类型的定义,以及对数据大小的预处理等各类功能。

这一功能在提升某些运算方面具有极大的潜力。对于同一架构、同一操作系统、同一 MATLAB 版本而言,编译完成后的 MEX 文件是通用的。但反之,架构、操作系统或 MATLAB 版本中的任一因素均可导致 MEX 文件不可通用。所以,对于开源软件作者而言,还是维护源代码比维护二进制发行版更为现实。但这也要求用户掌握对 MEX 编译环境的配置。

MEX 相关功能在三类主流操作系统上都有所支持,但各个系统上 MATLAB 所支持的编译器种类不尽相同。Windows 上受 MATLAB 支持的编译器种类是最多的,其中包括由 Intel Parallel Studio 自带的大名鼎鼎的 Intel C++ Compiler。

在大多数情况下,编译器安装好后,通过简单执行 mex -setup language_name ,MATLAB 就能通过环境变量或注册表值找到所需的编译器文件。但是,有可能出现以下几种情况:

  • 环境变量设置不正确
  • 注册表键值设置不正确
  • MATLAB 版本号较小,无法支持当前新版本的编译器(如 R2017a 无法支持 Intel Parallel Studio XE 2018,默认只能支持 2017 及以下版本)

就个人经历而言,曾把 Visual Studio 2017 从 SSD 的系统盘中卸载后重装到 HDD 中去过一次,但重装后对应的注册表键值却没有被安装程序重新修改。对于这种情况,在设置 mex 时开启 verbose 模式就可以看得很清楚到底哪里缺东西或是搞错了。

>> mex -setup C++ -v
Verbose mode is on.
... Looking for compiler 'Intel C++ Composer XE 2013 with Microsoft SDK 7.1' ...
... Looking for environment variable 'ICPP_COMPILER14' ...No.
... Looking for environment variable 'ICPP_COMPILER13' ...No.

...

... Looking for registry setting 'HKLM\SOFTWARE\Wow6432Node\Microsoft\VisualStudio\SxS\VS7' 15.0 ...Yes ('Some_Wrong_Path').
... Executing command 'set "vcroot=Some_Wrong_Path"&for /f "delims= " %a in ('type "Some_Wrong_Path\VC\Auxiliary\Build\Microsoft.VCToolsVersion.default.txt"') do @if exist "Some_Wrong_Path\VC\Tools\MSVC\%a\bin\HostX64\x64\cl.exe" call echo %vcroot%' ...Yes ('Some_Wrong_Path').

而对于无法兼容最新版编译器的情况,在 MATLAB 或是对应编译器的接口没有 break changes 的情况下,一般是能够两边调通的。要做的就是告诉 MATLAB,要去找哪些依赖文件,能运行怎样的编译命令。

GitHub:rymut/matlab-mex-intel18 这个仓库中(MATLAB Central File Exchange 镜像),我们就能找到让 R2017a 支持 2018 版英特尔 ICC 的 XML 配置文件。而在 R2017b 中,已经内置了对应的 XML 配置文件。如果下载到对应路径后,再运行开启 verbose 模式的 mex setup 命令,就能看到与 XML 文件中 <locationFinder> 下相对应的搜寻过程了。

看完本文,可以试试运行  cd([matlabroot '\bin\win64\mexopts']) 进一步探索有哪些可以自由定制的选项。

发表评论

电子邮件地址不会被公开。 必填项已用*标注