我最近打算開始學寫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。
[轉] http://www.douban.com/note/132392388/