之前在ubuntu下用新立得安装lapack,之后再安装phg时可以自动识别出BLAS/LAPACK库,而在centos下通过yum install 安装lapack后,phg在配置时不能识别出BLAS/LAPACK库,只能从LAPACK官网下载源码自己进行编译。
我最近打算开始学写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.f 和 snrm2.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。
==================
后记:for Mac Users
后来我换成Mac的电脑。Mac的好处是不用安装LAPACK了,它已经内置在Mac的vecLib里面了。要使用LAPACK的过程,只需要在编译程序的时候加上 -framework vecLib就可以了。
但是Mac 没有自带ARPACK,所以还是需要安装一下的,不过也比Windows简单了。到ARPACK的官网上下载arpack96.tar.Z和patch.tar.Z到本地目录。从该目录打开terminal,输入以下命令来把安装包和补丁解压缩到一起去
zcat arpack96.tar.Z | tar -xvf -
zcat patch.tar.Z | tar -xvf -
这时候会生成一个ARPACK目录,cd进去
cd ARPACK
然后打开ARmake.inc那个文件,这里面有以下几个地方要改
home = .
DIRS = $(UTILdir) $(SRCdir)
FC = gfortran
FFLAGS = -O3 -framework vecLib
MAKE = /usr/bin/make
其他不变。然后按照前文所述,需要更改并保存 second.f (在UTIL子目录下)。然后在ARPACK目录下输入
make lib
就会看到开始编译。但是最后在ranlib的时候会出错,不知道为什么Mac不能用ranlib。但是没关系,这时候可以继续用libtool来组装库文件
libtool -o libarpack.a SRC/*.o UTIL/*.o
这样就得到了libarpack.a这个库文件。然后可以如前文所述使用。
本机有win7 64位,安装Ubuntu 32位都没问题,很顺利。64位(12.4或者13.4都试过),安装开始一切顺利,安装完成之后重启。但是在grub引导里面,没有进入ubuntu的,只有四个选项。使用不安装ubuntu,安装ubuntu,OEM安装,第四个忘了(大致是这个意思,我安装英文版的)欢迎分享,转载请注明来源:内存溢出
评论列表(0条)