如何在Windows下使用LAPACK和ARPACK [转]

我最近打算开始学写Fortran程序和使用LAPACK和ARPACK。在学校的Linux上,一个make就搞定了。但是我自己的电脑是 Windows 7系统,什么cmake, nmake的我都试过了,没有一个能够make出来的。网上也有很多Windows下怎么用LAPACK的资料,有的直接给我一个编好的 LAPACK.lib,结果发现不能在gfortran上连接;有的要改Makefile什么的,我觉得都是写给高手看的。所以从前天开始我自己在家里捣 鼓了一个周末,终于弄通了,写个总结在这里做个备忘。希望有情况跟我类似的人会得到帮助。

一、Fortran 的安装
我需要一个可以在Window下使用的Fortran编译器。我不喜欢Compaq Fortran 的原因是它调试通过的程序,经常不能在学校的gfortran上面通过;而且它 的编辑器没有 code folding 非常不爽;还有就是太贵买不起。我比较推荐 Simply Fortran编辑器,小巧简单,并自带一个gfortran的编译器(Simply Fortran的安装程序:simplyfortran-1.9-setup.exe), 注册费是25美元。Simply Fortran安装起来以后,在安装目录下的 mingw\bin 这里面就有GNU的编译器 gcc 和 gfortran以及其它一堆有用的工具,这些东西下面会用到。当然如果只想要编译器的话可以直接安装 gfortran (安装程序:gfortran-windows-20110214.exe),安装好了以后编译器在gfortran\bin里面。

二、LAPACK库的编译
接下来,我要把LAPACK弄起来。于是我到netlib上下载了最新版本(lapack-3.3.0.tgz),然后解压缩出来。由于我没有BLAS库,所以我想把BLAS和LAPACK一起编译成一个库以后就可以一起用了。具体做法如下:
1. 打开解压缩文件夹,把lapack-3.3.0\BLAS\SRC里面的所有*.f文件 以及 lapack-3.3.0\INSTALL里面的dlamch.f和slamch.f两个文件 都复制到 lapack-3.3.0\SRC 文件夹里面。复制的时候提示有两个文件是重复的,我选择了不要覆盖。这样BLAS和LAPACK两个库的源文件都在一起了。
2. 然后cmd进入DOS,先检查path里面有没有 mingw\bin (或者gfortran\bin)。
E:\lapack-3.3.0>path
PATH=D:\Program Files\Simply Fortran\fwin\mingw\bin;......
如果Simply Fortran安装正确的话,应该会自动添加mingw\bin到搜索路径的。如果没有的话就手动添加一下
E:\lapack-3.3.0>path=D:\Program Files\Simply Fortran\fwin\mingw\bin; %path%
Simply Fortran的安装目录根据自己情况要修改一下。
3. DOS进入lapack-3.3.0\SRC目录,用gfortran 开始编译
E:\lapack-3.3.0>cd SRC
E:\lapack-3.3.0\SRC>gfortran -fimplicit-none -g -c *.f -O2
(等待十几分钟,可以在Windows下看到SRC文件夹里面源源不断地冒出.o文件)
然后以下文件需要无优化地重新编译
E:\lapack-3.3.0\SRC>gfortran -fimplicit-none -g -c slaruv.f -O0
E:\lapack-3.3.0\SRC>gfortran -fimplicit-none -g -c dlaruv.f -O0
E:\lapack-3.3.0\SRC>gfortran -fimplicit-none -g -c sla_wwaddw.f -O0
E:\lapack-3.3.0\SRC>gfortran -fimplicit-none -g -c dla_wwaddw.f -O0
E:\lapack-3.3.0\SRC>gfortran -fimplicit-none -g -c cla_wwaddw.f -O0
E:\lapack-3.3.0\SRC>gfortran -fimplicit-none -g -c zla_wwaddw.f -O0
我是一行一行执行的……
4. 用ar 连接成一个库
E:\lapack-3.3.0\SRC>ar rcs liblapack.a *.o
这样就在SRC文件夹里得到LAPACK库文件 liblapack.a。

三、ARPACK库的编译
先到ARPACK的官方网站去下载程序包,我选择下载了 arpack96.tar.gz 和补丁 patch.tar.gz
1. 把两个压缩文件分别解压以后,第一步是先打上补丁。复制patch下的ARPACK 粘贴到 arpack96 里面去覆盖同名文件, 在Win7上会提示合并文件夹,选择是,然后会提示复制和替换文件,选择全部替换就行了。
2. 把 arpack96\ARPACK\BLAS,arpack96\ARPACK\LAPACK 和 arpack96\ARPACK\UTIL 中的 *.f 文件都复制到 arpack96\ARPACK\SRC 里面去。然后有三个源文件需要改动。首先,找到second.f 打开,把里面的内容改成:
      SUBROUTINE SECOND( T )
      REAL T
      CALL CPU_TIME(T)
      RETURN
      END
保 存。因为原来的程序要调用ETIME来返回时间,但是连接的时候会出错提示找不到ETIME。我看了一下gfortran 里好像是用 CPU_TIME 来计时的,所以就改过来。还有就是 dnrm2.f 和 snrm2.f 使用了ASSIGN statement, 这个语句在Fortran 95 的标准里面已经被删除了,所以gfortran 不能编译这两个文件。因此,需要到netlib上下载它们的更新版本: dnrm2.fsnrm2.f 并替换旧版文件。
3. 接下来编译ARPACK和LAPACK基本原理是类似的。用DOS进入 arpack96\ARPACK\SRC 目录,用gfortran 开始编译:
E:\arpack96\ARPACK\SRC>gfortran -fimplicit-none -g -c *.f -O2
4. 用ar 连接成一个库
E:\arpack96\ARPACK\SRC>ar rcs libarpack.a *.o
这样就在SRC文件夹里得到ARPACK库文件 libarpack.a。

四、LAPACK的使用
如果用gfortran直接编译的话,有两种选择。第一种方法,先把liblapack.a和libarpack.a复制到程序源文件的目录下,然后一起编译
gfortran foo.f90 liblapack.a libarpack.a
第二种方法是把liblapack.a和libarpack.a复制到 gfortran 所在目录下的 \lib 里面,然后以后编译的时候只要加上 -llapack 或 -larpack的flag就可以了
gfortran foo.f90 -llapack -larpack
这个就和Linux下是一样的了。

在Simply Fortran里面用的话,先确保 liblapack.a和libarpack.a 已经复制到 mingw\lib 里面,然后从Options菜单打开Project Options,在Project Flags的Linkers里面添加 -llapack 或 -larpack 就行了,不过每个project都要设定project flags。注意要用1.11以上版本的Simply Fortran,旧版的Project Flags放置的位置有 bug。

 

[转] http://www.douban.com/note/132392388/

posted on 2012-04-20 18:58  龙豆  阅读(4143)  评论(0编辑  收藏  举报

导航