我最近打算開始學寫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/