各位常用MATLAB的朋友都知道64位系统下matalb内存管理性能要优秀的多,基本不会出现由于内存碎片导致的 out of memory错误, 但是在64位系统中,很多人都与我一样发现会出现找不到编译器的错误,哪怕完全按照官方要求 装了VS2005,以及其中的64bit compiler and tool。 同样这个问题也困扰了我很久,导致无法编译生成libsvm的.mexw64文件。 包括参考这篇文章手动指定安装目录,但是无效!随后我又重新测试了 速成班 VS2005 VS2010等不同版本,甚至重装MATLAB,都均告失败。 最后本人决定今天决定一行行代码调试,将其问题找出! 艰巨的工程由此开始: 从MATLAB开始 mex -setup 的调用跟踪为 mex.m -> mexhelper -> line 52 :errCode = dos([ cmd ' -' computer('arch') ]); cmd 内容为 cmd = "D:\Program Files\MATLAB\R2007b\sys\perl\win32\bin\perl.exe" "D:\Program Files\MATLAB\R2007b\bin\mex.pl" @"D:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\tp255a6fcd_0783_4825_8558_160d6d36fdaf.rsp" 到此为止 本人傻眼了,居然是perl.exe,完全没弄过,还好是脚本语言,是明文... 于是上网找 perl的资料 ,尤其是调试资料! 老实说perl真是晦涩,都看得我眼睛发疼,不由想脚本语言也不能为了简便,搞出那么多符号,整个代码像鬼画符一样! 老实开始啃吧... perl的调试倒是方便,只要加个 -d 就进入调试模式,毕竟是解释语言啊~~~~ 全命令行模式,老子终于也看着像高手一会了(曾经巨佩服不用IDE写程序的人....) 。。。省略了1W字,耗时5小时,其中的艰难就不说了... 我终于找到问题! 大多数对MEX略有了解的人,都会猜MEX的编译问题多半出在 %MATLAB%\bin\win64\mexopts目录里的配置文件上 可我嘛................. 也是这么想的... 打开msvc80opts.stp(VS2005的配置文件),一看居然是perl语言的脚本 前面有行显眼的 my $default_location = "C:\\Program Files(x86)\\Microsoft Visual Studio 8"; 得...很多人都和我一样VS2005没有装C盘,直接改了以为OK了 其实大错特错,MATLAB 这个变量只是默认路径,对于非默认路径安装的VS,软件会通过注册表查找路径 具体如下: # Search the registry. $msvc8_root = &$registry_lookup_fcn("SOFTWARE\\Microsoft\\VisualStudio\\8.0\\" . "Setup\\VC", "ProductDir"); 可见问题不在这里,没法了只能一步一步调试了,尤其恶心的是stp文件不是pl也不是pm,为了找到其调用方式,进入调试着实费了我一番功夫。 终于让调试 进入 msvc80opts.stp(类似Dll动态加载,但是不是函数形式 看:my @locations = &$locate_fcn; 就这么一行搞定了,真.....) OK, 接下来简单了,跟踪呗,发现问题出在这里,并非我原来所想的文件目录 路径之类的问题 而是 版本比对出错的问题!! if (&correct_version("$msvc8_root\\VC\\bin\\amd64\\cl.exe","14.0")){ push(@msvc8_roots, $msvc8_root); } 找到&correct_version函数的定义 一看 sub correct_version { #=================================================================== # correct_version: A local function to returns true if the version # of the compiler matches the expected version string. #=================================================================== my $executablePath = $_[0]; my $versionNumber = $_[1]; my $version=`\"$executablePath\" 2>&1`; return $version =~ /Version $versionNumber/; } # correct_version 问题在这行红色的代码上,一个正则表达式的匹配,上面这行实际上就是无参数执行cl.exe 将返回的 信息赋给$version 返回的信息如下: 用于X64的 microsoft <R> c/c++ 优化编译器 14.00.50727.42 版 版权所有...略 [local]3[/local] 看来这就是获得cl版本信息的方法,再看看代码里/Version $versionNumber/ 不用想了,这是针对鸟语版VS的.... 也就是说要是你使用的VS是英文版的,理论上市没问题的,同理要是是中文VS,哪怕2010照样嗝屁... 到此问题发现了,解决就轻而易举了,把“Version ”改成 “优化编译器”就可以了。 看到成功编译生成libsvm的.mexw64文件,这个心情爽啊!! 最后给懒人们附上修改好的 mexsetup.pm 文件,覆盖几可(注意only for 中文VS) ![]() |
|