matlab 2010 win7 64位,完成mingw-w64 与64 bit win7上的matlab 2010a 64 bit混合编译 | 学步园...

耗时近两个星期,终于整的可以用了。我的目的是要从64位的matlab上调用一个函数库。由一些Fortran代码,很多shell脚本,大量makefile和几个用c与fortran混合编写的mex文件组成。因为其命令大多是bash脚本,所以只能在类unix平台实现。

最一开始在32位utunbu虚拟机装了matlab r14。安装过程也颇费周折,因为装上后只能出来命令行的matlab,出不来IDE。后来发现是找不到java虚拟机的缘故。装个jre6,设置javahome以及path等环境变量后即正常了。但本子配置不算太好,运算规模大点的问题就慢的厉害,所以决定还是回到win7的64位matlab 2010a。

于是开始试着在cygwin上完成这个工作,计划使用了g95做为编译器,以及使用gnumex来产生mexopts.bat。 可实际开始做时,才知道matlab 64位不能调用32位mex,所以当时困惑的厉害,网上也找不到解决方法。看有人说道gnumex对mingw支持比cygwin好,我直接下载了mingw-w64,一个拥有64位gcc和64位gfortran的mingw。

首先下载了近二百M的mingw-w64文件,又找了一个32位的msys安好了。其后将msys的mingw指向mingw-w64的安装文件即可。windows shell下的mex命令是matlab bin目录中的mex.bat,这个在msys中不能执行。我们还要构造一个类似mex.bat的msys脚本。这个脚本调用mex.pl,同时将命令行参数传给mex.pl。

gnumex并没有运行起,在gnumex的官网上看到一个用户提到怎样运行在matlab 2010a上,于是照猫画虎做了一遍。但还解决不了问题,有了这些经验,于是自己在gnumex中下了断点,慢慢的跟踪的看出了啥问题。最主要的是要用matlab的mex命令基于64位的c编译器编译一遍src目录中的shortpath.c与uigetpath.c。得到两个文件shortpath.mexw64与uigetpath.mexw64,编译好后与gnumex.m放一块。我使用了vc++ 2008 express和windows sdk 6.1,两个软件下载需要近两个G,但是必须安装这两个软件来编译64位的mex。其它的问题都自己下断点瞅瞅原因都可以解决了。

接着反复的产生了数十次mexopts.bat。其中包括gfrotran的,gcc的,以及vc+ 2008的。期间出现的最多的问题就是未定义的引用。用gfortran时,引用不到matlab本身提供的库,如libmex.lib等。gnumex还专门给gfortran产生了一些叫flibmex.lib的库。但就是找不到符号,解决这个问题困扰了我一天多时间。后来使用了gcc版mexopts.bat。因为我的代码中有c有fortran,此时gcc引用不到gfortran的库,其实在mingw-w64的lib64文件夹有这个东东,在mexopts.bat加一行

set GM_ADD_LIBS=-llibmx -llibmex -llibmat -lgfortran

就行。同时链接时的lib环境变量指向mingw的lib64或直接把libgfortran.a拷到当前目录。期间我试了一下vc++调用gfortran编译好的程序库。windows的.lib文件与mingw中的.a文件似乎是一样的,因为我在vc++的cl可以访问.a文件。编译出现unresolved external symbol ___chkstk,这个原因是我的gfortran程序库中的全局变量太大所致。windows 中有_chkstk这个函数,但mingw-w64中的gfortran编译好的程序库并不使用这个,而是使用了gcc的一个名字大概叫aloca的符号,所以我们只在在编译时引用上libgcc.a就可以了。

有时,虽然编译很成功,但在matlab执行your_app.mex64时,老叫唤invalid mex,找不到指定程序。我使用gcc与gfortran混合编译出现这个问题后,通过dependent walker分析发现your_app.mex64需要libgfortran.dll支持,只需将windows 的path环境变量指向libgfortran.dll所在目录即可。而用vc++与gfortran混编时,虽然指向了,但出了问题,本该出现在libmex.dll的调用入口函数mexErrMsgTxt 不知为什么指向libgfortran.dll。所以最终还是使用gcc+gfortran的组合,不过也发现了一种vc 与gfortran混乱编的可能性。

还有一个未解决的问题就是mingw-w64 编译出来的mex文件在使用时如果入口参数以及出口参数是空的话,可以轻易的导致matlab崩溃。所以在使用这些函数时,要特别留意检查入口和出口参数。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值