分享

【原创申精】彻底解决MATLAB

 imelee 2017-09-20
各位常用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.stpVS2005的配置文件),一看居然是perl语言的脚本



前面有行显眼的 my $default_location = "C:\\Program Filesx86\\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

返回的信息如下:

用于X64microsoft  <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

mexsetup.rar (9.28 KB, 下载次数: 87888)

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多