解决matlab错误使用 mex 未找到支持的编译器或 SDK一系列问题

时间:2024-03-28 09:00:17

在Matlab中使用mex可以编译c/c++ ,但是首先要设置好编译器,可以使用mex -setup命令来设置。但在命令行中输入mex -setup时,报错:(错误使用 mex 未找到支持的编译器或 SDK。您可以安装免费提供的 MinGW-w64 C/C++ 编译器;请参阅安装 MinGW-w64 编译
器。有关更多选项,请访问 http://www.mathworks.com/support/compilers/R2016a/win64.html。)

按照提示的可以下载MinGW-w64 C/C++,下载后进行安装。但是若是我们已经安装了VS,则可以用下面的方法。

由于Matlab从2016版本以后使用xml文件来保存配置文件,所以如果使用的Matlab是2016以前的版本,方法可能和本文有所区别。(本文以Matlab2016a和Visual Studio2017为例)我已经安装了VS2017版本,但是我是先安装的matlab后安装的Visual Studio,或者其它一些原因,mex -setup命令无法找到安装好的Visual Studio编译器,仍然报同样的错误,那么就需要进行一些修改才能成功设置编译器了。
在Matlab的安装目录\bin\win64\mexopts(比如我的:E:\Matlab2016a\bin\win64\mexopts)目录中有各种编译器的配置文件,Matlab就是依靠这些xml文件和编译器建立关联,打开文件,查看你的matlab支持的VS版本是否包含你安装的VS版本。

你的错误可能是matlab 根本就找不到VS,原因就是matlab根本就不支持VS20xx(比如matlab2016a支持的最高版本就到2015,如下图,红框的部分是我在网上下载的支持文件。)
解决matlab错误使用 mex 未找到支持的编译器或 SDK一系列问题
下载mexopts补丁文件 : https://kaba.hilvi.org/homepage/blog/blog.htm
解决matlab错误使用 mex 未找到支持的编译器或 SDK一系列问题
选择对应版本
解决matlab错误使用 mex 未找到支持的编译器或 SDK一系列问题
下载后解压放在目录中(Matlab的安装目录\bin\win64\mexopts),运行mex -setup,配置你的VS编译器。
一般来说到这里就解决了。感谢博客(https://blog.csdn.net/qq_17783559/article/details/82017379?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.add_param_isCf&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.add_param_isCf)

但是我的问题有点复杂,因为这时,又报错:e:\matlab2016a\extern\include\matrix.h(23): fatal error C1083: 无法打开包括文件: “stdlib.h”: No such file or directory
我的内心是崩溃的,然后各种查问题,尝试解决。最后得出的结论就是SDK的版本问题。打开Visual Studio Installer,查看VS使用的SDK,就是红框框的圈住的。然而matlab安装目录\bin\win64\mexopts目录下的msvcpp2017.xml使用的WinKit居然写死了include的引用路径为$KITSROOT\include\10.0.16299.0\ucrt,但这个不存在的路径在使用mex -setup设置期间是不报错的,导致在实际的编译过程中,出现找不到“stdlib.h”的错误。
解决matlab错误使用 mex 未找到支持的编译器或 SDK一系列问题
要修复以上的错误,需要两个步骤:

  1. 修改 bin\win64\mexopts目录下的msvc2015.xml,将其中10.0.16299.0替换成有效的10.0.17763.0(这里是我的配置,你要看自己对应的版本)
  2. Matlab2017a在第一次使用mex -setup设置成功(虽然实际是存在错误的)后,会将mex编译器配置保存到C:\Users\Administrator\AppData\Roaming\MathWorks\MATLAB\R2017a下的mex_C_win64.xml中,因此只做第一步是无效的,需要将该xml文件也修改了
    然后,就大功告成啦,终于解决了,希望也能帮助到你们。
    提示:c++编译器若存在通用问题也是按照以上方法修改。