因为目标追踪领域最著名的比赛VOT(Visual Object Tracking),同时也拥有一个非常重要的数据集和一套比较权威的评价指标,基于的是matlab,因此我又开始用起了matlab(这么看下来貌似matlab要成我本学期用的最多的语言了)。当我download官方的toolkit之后,按着document一路比较顺利地操作了下来,结果突然遇到一个报错,说我没有C和C++编译器。WTF?我用了这么久居然都没发现这个问题…
本以为按照提示就能很快解决,结果这个问题折腾了我一整个晚上。好吧既然被折磨得这么惨那我还是本着逢血泪必写博的原则在这里写一下吧。
不过不得不说,最后成功的时候真的还是挺爽的哈哈!
References:
电子文献:
https://ww2.mathworks.cn/help/matlab/matlab_external/compiling-c-mex-files-with-mingw.html?requestedDomain=uk.mathworks.com
https://ww2.mathworks.cn/matlabcentral/fileexchange/52848-matlab-support-for-mingw-w64-c-c-compiler
https://www.cnblogs.com/Vae1990Silence/p/10102375.html
https://blog.csdn.net/fly910905/article/details/86222946
MinGW
MinGW,是Minimalist GNU for Windows的缩写。它是一个可自由使用和自由发布的Windows特定头文件和使用GNU工具集导入库的集合,允许你在GNU/Linux和Windows平台生成本地的Windows程序而不需要第三方C运行时(C Runtime)库。
当初报错的时候,我也是很诧异,因为之前使用CodeBlocks和Visual Studio的时候明明是有的。而这次在matlab中编译C/C++时怎么就找不到了。
因为之前使用CodeBlocks也有找不到的情况,我当时是重装了一遍CodeBlocks解决问题的,因此我上网开了一下有没有类似的方法。按道理来说已经装了VS是可以找到的,但好像也存在即使安装了VS、matlab还是找不到编译器的情况。可以使用mex看一下具体是哪些路径没有匹配上,似乎可以通过修改注册表的方法解决,但我没有尝试。
注:matlab调用C/C++的方式主要有两种:利用MEX技术和调用C/C++动态连接库。MEX是Matlab Executable的缩写,它是一种“可在matlab中调用的C(或Fortran)语言衍生程序”。后文中还会用到。
失败的方法
毕竟是花了一个晚上,看了mathworks上网友们的各种solution,试错了许多方法,这里记录两个貌似要成功的方法(其实最后还是失败了),或许会有参考价值。
这里有一个被许多网友强调、要注意的是:下载后的mingw文件(没错它只有15kb看上去好假)要在打开的matlab中,找到相应的下载目录,右键点击然后选择下载并安装(download and install),否则似乎会出错。
禁用IPv6
IPv6,顾名思义,就是IP地址的第6版协议。
我们现在用的是IPv4,它的地址是32位,总数有43亿个左右,还要减去内网专用的192、170地址段,这样一来就更少了。
然而,IPv6的地址是128位的,大概是43亿的4次方,地址极为丰富。
网友Kshitij Mall给出了这样一个解决思路:- 首先打开控制面板中的编辑系统环境变量。
- 在高级选项中,点击环境变量。
在系统变量栏中添加如下两个变量:(1)variable name:“JAVA_TOOL_OPTIONS”;value:“-Djava.net.preferIPv4Stack=true”;(2)variable name:“JAVA_OPTIONS”;value:“-Djava.net.preferIPv4Stack=true”。另外根据该网友所述,安装完成后可以删去这两个环境变量。
注意:仅输入引号内部的内容。
java文档指示,设置jvm属性java.net.preferIPv4Stack为true时,就可以禁用IPv6。反之,若设为0,则启用。
注:禁用设置时不需要重启系统。
由于该网友的系统配置和我相同(MATLAB 2019a on Windows 10 system with 64 bits),于是我毫不犹豫地首先尝试了他的方法,不知道是卡进去的原因还是为何,我成功看到了协议界面(原本一直卡在附加功能管理器加载的空白界面),但是最终开始下载支持包失败。
关闭防火墙
失败之后,我继续看评论,看到一个网友感谢另一个网友提供的solution,我非常激动,感觉自己也要跟着解决了。
似乎好像取得了一定的进展,但是在下载第三方包的时候还是卡住了(3rt party download error),我浏览了大多数网友的评论,貌似大家基本上都卡在了这里。
成功的方法
当我快要绝望的时候,突然看到了评论区感谢三连,都是感谢同一个人的。这已经是2018年的一个回复了,看评论发现他们使用的是Windows 7系统,但我决定还是试一下,结果真的成功了,非常感谢最初的solution提供者pawan singh!
具体方法如下:
- 到这个网址下载合适的TDM-GCC。
- 下载之后,create一个新的到设定的安装路径中。
注意:根据matlab文档(文首第一个参考链接)。MinGW的安装文件夹名称不能包含空格。例如,不要使用:C:\Program Files\mingw-64。应改用:C:\mingw-64。我建议直接装在C盘下面,默认似乎也是这样,维持不变即可。
- 与之前修改系统变量方式类似。添加新的系统变量名为
MW_MINGW64_LOC
,值为MinGW-w64编译器的安装位置,于我是C:\TDM-GCC-64
。最后别忘了确定设置。 - 在matlab命令行内执行命令:
setenv('MW_MINGW64_LOC', 'path')
,folder为TDM-GCC的安装位置,要加单引号。例如我是:setenv('MW_MINGW64_LOC', 'C:\TDM-GCC-64')
。 - 可以继续在命令行中执行命令:
mex -setup
。若没有报错,则表明成功了。
然而
英语老师说,however后面的往往是重点,那么我这里就however一下。
上面的方法问题是没有,但是使用的时候有可能会收到警告:使用的是不受支持的MinGW编译器版本。
如果没有收到这个警告,那么就万事大吉,如果有的话,能运行的话依旧还是万事大吉。
But如果真的因此而运行出错,或者看着warning心里实在不舒服的话,可以看一下我后来写的matlab笔记:MEX文件函数使用中的问题。