NETCDF安裝筆記:
以下筆記是於Red Hat Enterprise Linux 4底下的NETCDF 4.1.3安裝紀錄,當初升級NETCDF的原因我想不大起來了,可能是想要升級NCAR Graphics吧,安裝過程中也一併安裝了其他軟體,如szip、HDF等等。安裝大致是依照官方網站上的步驟進行的。
首先安裝szip:
- 下載szip V2.1並解壓縮,這個檔案我是從HDF Group抓的,不是szip官方網站,不過老實說我也不清楚szip的官方網站是哪一個。
- 解壓縮後給以下指令
[root@HPC ~] CFLAGS=-fPIC ./configure --prefix=/opt/app/szip --disable-shared |
-fPIC是要讓它產生Position-Independent Code,一定要加,不然裝NETCDF時會出問題
--prefix指定要安裝的位置,如果不加通常會安裝到/local/usr下
--disable-shared讓他成為靜態函式庫
- 最後依序執行以下指令來安裝即可,記得檢查安裝過程有沒有出錯。
[root@HPC ~] make >& make.output-szip21
[root@HPC ~] make check
[root@HPC ~] make install |
接著是HDF4 - 4.2.6:
- 下載HDF4並解壓縮,如果你只要用NCAR Graphics但不需要使用HDF格式檔案的話就不用裝,而如果要用NCL的話就要。
- 解壓縮後執行
[root@HPC ~] ./configure --prefix=/opt/app/hdf4 --with-zlib=/usr/lib64 --with-jpeg=/usr/lib64 \
--with-szlib=/opt/app/szip --disable-netcdf --includedir=/opt/app/hdf4/include/hdf |
--with-zlib、--with-jpeg、--with-szlib分別是指定你的zlib、jpeg、szip lib位置
--disable-netcdf是要求不使用HDF內建的NETCDF函式庫(因為稍後會安裝NETCDF啊!)
--includedir是指定HDF的include file的位置,如果你沒有指定prefix的話那這個一定要加,不然這些檔案可能會被放到/usr/local/include下,這樣會跟NETCDF的include file重疊
註:若先前安裝szip時沒有指定--disable-shared,在這可能會遇上找不到libsz.so.2這個共享函式庫的問題,這是因為雖然安裝了szip,但是沒有更新動態函式庫的搜尋路徑,使得ld指令在呼叫函式庫找不到它,只要在/etc/ld.so.conf中加入/opt/app/szip/lib來指定你的szip函式庫位置,並執行/sbin/ldconfig -v更新即可。
- 最後依序執行以下指令:
[root@HPC ~] make >& make.output-HDF426
[root@HPC ~] make check >& make.check-HDF426
[root@HPC ~] make install |
- 安裝完畢後即可做環境設定,請將以下幾行加入你的.bashrc或是/etc/profile之類的環境設定檔中:
export HDFROOT=/opt/app/hdf4
export HDFINC=$HDFROOT/include
export HDFLIB=$HDFROOT/lib
export PATH=$HDFROOT/bin:$PATH |
參考資料:HDF Group官方安裝說明
NCAR NCL安裝說明-HDF 4
NETCDF - 4.1.3
安裝NETCDF前有幾點要注意:
- 根據官方網站的說明,configure前最好先依據編輯器設定不同的FLAG,若是跟我一樣使用PGI 的編譯器,要把CPPFLAGS設定為-DpgiFortran(若為gfortran則是-DgFortran,詳見註1),這是為了要讓NETCDF的函數能夠正確的被呼叫,會依照編譯器的不同在函數名稱前加上所需的底線,不過在這裡我加不加這個FLAG都可以成功編譯,保險起見還是不要略過囉。
- 若是為了WRF或是NCAR Graphics(NCL)而裝的,那麼於configure時一定要加上--disable-netcdf-4,因為WRF / NCL不支援NETCDF 4裡的一些太新穎的功能(註2)。
- configure時不要加上--enable-benchmark這個flag,我在一開始有加這個flag,但在make check時會遇上無解的錯誤,送ticket到官方網站詢問所得到的回答是這個問題在這個版本應該算個bug。(有興趣的人可以去翻翻他們的Known Porblems頁面)
註1:Building and Installing NetCDF on Unix Systems - Platform Specific Note
註2:"The WRF modeling system currently only uses its classic data model, supported in netCDF-4."
WRF User Guide Chapter 2: Software Installation
Building NetCDF with Classic Library Only
註3:[netCDF #KMW-354832]: "make check" error report for NETCDF-4.1.3
- 下載NETCDF並解壓縮
- 設定你的編譯器,編譯指令
[root@HPC ~]# export CPPFLAGS=-DpgiFortran
# 如果是csh的使用者,請用setenv |
- 執行以下指令(由於版本不同,所加的編譯指令也會不同,詳細用法請見官方網站之說明)
[root@HPC ~] ./configure --prefix=/opt/app/NETCDF --with-zlib=/usr/lib64 \
--with-szlib=/opt/app/szip/lib --with-temp-large=/scra3/ --enable-hdf4-file-tests \
--disable-netcdf-4 --with-udunits --enable-large-file-tests --enable-dap |
--with-zilb與--withszlib分別是用來指定zlib以及szip函式庫的位置。
因為加了–enable-large-file-tests啟動對超過2GB的大檔案的測試,所以要用--with-temp-large指定存放位置,大概會需要13GB的空間,在make check時也會多花一點時間。
--with-udunits一併編譯udunits這個拿來作單位轉換的套件
--disable-netcdf-4,重要,若為安裝給WRF用的這一定要加
--enable-dap啟用對DAP檔案的支援
- 設定結束後,即可開始安裝
[root@HPC ~] make >& make.output-NETCDF413
[root@HPC ~] make check >& check.output-NETCDF413
[root@HPC ~] make install
[root@HPC ~] nc-config --version
netCDF 4.1.3 |
make check最好是跑一下,確定它沒有問題。
如果在make時出現跟szip有關的問題,那可能是當初安裝szip時沒有加上-fPIC,重新安裝szip即可。
而若出現:
PGF90-S-0038-Symbol, nf90_set_var_chunk_cache, has not been explicitly declared (f90tst_vars2.f90)
0 inform, 2 warnings, 2 severes, 0 fatal for f90tst_vars2
make[2]: *** [f90tst_vars2.o] Error 2
這樣的話得單獨安裝fortran的函式庫,請回到configure,加上--disable-fortran讓NETCDF略過它,這樣一來lib資料夾中將不會出現libnetcdff.*的檔案,完成安裝後再另外安裝fortran的函式庫。
如果在安裝RIP4(或其他程式)的時候遇上大量以nf_開頭的函數出現"undefined reference"的錯誤訊息,例如:
[root@RIP4 ~]# ./compile
refmos2calc.o(.text+0xbd): In function `refmos2calc_':: undefined reference to `nf_open_'
refmos2calc.o(.text+0xe0): In function `refmos2calc_':: undefined reference to `nf_inq_dimid_' |
那是因為較新的NETCDF已經將C/Fortran的函式庫(libnetcdf.a / libnetcdff.a,後者多個f)分開了,在網路上搜尋你可能會找到用CPPFLAGS=-DpgiFortran就能解決的說法,可惜在這裡是行不通的,因為那些nf_open_函數都是寫在libnetcdff.a裡面,解決辦法就是在Makefile裡面
搜尋library的地方多指定一個-lnetcdff。
參考資料:Compile error when make check
NCAR NCL安裝說明-NETCDF
[netCDF #VEM-652223]: nf_open
PGI User Forum - NETCDF Undefined Reference
<-Memo