本文參照博客的講述,介紹在linux服務器上安裝netcdf的一般方法。主要的目的是實現數據壓縮的功能,其他詳細的介紹可以參考官方指南。
獲取編譯所需源碼
首先安裝所需要的包實現Data Compression所必須的包只有四個:
- HDF5 1.8.9 or later (for netCDF-4 support)
- zlib 1.2.5 or later (for netCDF-4 compression)
- netcdfc (latest version)
- netcdf-fortran(latest version)
另:非必裝:curl 7.18.0 or later (for DAP remote access client support)
安裝
由於一般服務器中可能會同時共存很多編譯器,這里首先指定使用intel編譯器編譯:
指定編譯器
對於linux:
export CC=icc
export CXX=icpc
export CFLAGS='-O3 -xHost -ip -no-prec-div -static-intel'
export CXXFLAGS='-O3 -xHost -ip -no-prec-div -static-intel'
export F77=ifort
export FC=ifort
export F90=ifort
export FFLAGS='-O3 -xHost -ip -no-prec-div -static-intel'
export CPP='icc -E'
export CXXCPP='icpc -E'
對於mac:
export CC=icc
export CXX=icpc
export CFLAGS='-O3 -xHost -ip -no-prec-div'
export CXXFLAGS='-O3 -xHost -ip -no-prec-div'
export F77=ifort
export FFLAGS='-O3 -xHost -ip -no-prec-div -mdynamic-no-pic'
zlib安裝
這里為了后續便於管理,所以選擇將這些包都編譯安裝在/usr/local/文件夾下,因此也需要sudo權限
ZDIR=/usr/local/zlib #安裝文件夾
mkdir ${ZDIR}
./configure --prefix=${ZDIR}
make check
make install
hdf5安裝
H5DIR=/usr/local/hdf5
mkdir ${H5DIR}
./configure --with-zlib=${ZDIR} --prefix=${H5DIR} -enable-fortran -enable-cxx
make check
make install
這里需要注意的是,在安裝hdf5時,必須要有–with-zlib=${ZDIR},否則會報錯相關庫文件找不到。並且在個人PC機上安裝時,可能會提示C++的注釋方式不可用於IS90規范中,遇此錯誤,目前的解決方法是找到相關文件,將C++的注釋方式//改為C的注釋方式/ /,目前已知安裝過程中有兩個文件共兩處需要修改。
更多內容可以參考hdf5相關配置選項
hdf4安裝
在實際的安裝過程中,由於程序需要同時使用hdf4和hdf5的庫,因此這里給出hdf4的安裝過程。
在安裝hdf4之前,需要安裝依賴庫,jpeg,szip
jpeg安裝
在按照上面所提到的過程制定編譯器之后,先到jpeg的網站下載源代碼包,解壓后執行:
JPEGDIR=/usr/local/jpeg
mkdir ${JPEGDIR}
./configure --prefix=${JPEGDIR}
make check
make install
szip安裝
SDIR = /usr/local/szip
mkdir ${SDIR}
./configure --prefix=${SDIR}
make check
make install
編譯安裝hdf4
在這一步的時候有可能會遇到一些問題,需要注意./configure 的參數。在執行前建議先使用:
./configure --help
下載並解壓hdf4安裝包之后,請先確定服務器中是否安裝了編譯所需要的yacc和flex,若沒有,請執行下列代碼進行安裝:
# ubuntu
sudo apt-get install byacc
sudo apt-get install flex
# centos
sudo yum instal byacc
sudo yum install flex
滿足了基本的編譯條件之后,執行:
mkdir /usr/local/hdf4
./configure --with-szip=/usr/local/szip --with-jpeg=/usr/local/jpeg --with-zlib=/usr/local/zlib --disable-netcdf --enable-fortran --prefix=/usr/local/hdf4
make check #在對source code進行test的時候發現在hdfnctest這個測試中花費大量的時間,但是在中斷make check直接make install居然成功了
make install
詳細的參數請參考netcdf的官方介紹
安裝netcdfc
NCDIR=/usr/local/netcdf4c
H5DIR=/usr/local/hdf5
H4DIR=/usr/local/hdf4
mkdir ${NCDIR}
CPPFLAGS=-I${H5DIR}/include LDFLAGS=-L${H5DIR}/lib
CPPFLAGS=-I${H4DIR}/include LDFLAGS=-L${H4DIR}/lib
export LD_LIBRARY_PATH=${H5DIR}/lib:${LD_LIBRARY_PATH}
./configure --prefix=${NCDIR} --enable-netcdf-4 --enable-largefile --disable-dap #這里在加入 --enable-hdf4參數之后始終會報錯,錯誤為找不到hdf4 library,但是可以看到我事先已經將hdf4 lib加入到了環境變量中 這里存疑 但是不需要netcdf支持hdf4 因此可以忽略這點
make check
make install
安裝netcdff
NFDIR=/usr/local/netcdf4f
NCDIR=/usr/local/netcdf4c
mkdir ${NFDIR}
export CPPFLAGS="-I/usr/local/szip/include -I/usr/local/zlib/include -I/usr/local/hdf5/include -I/usr/local/netcdf4c/include"
export LDFLAGS="-L/usr/local/szip/lib -L/usr/local/zlib/lib -L/usr/local/hdf5/lib -L/usr/local/netcdf4c/lib"
export LD_LIBRARY_PATH=${NCDIR}/lib:${LD_LIBRARY_PATH}
CPPFLAGS=-I${NCDIR}/include LDFLAGS=-L${NCDIR}/lib ./configure --prefix=${NFDIR} --disable-fortran-type-check
make check
make install
安裝結果
nc-config -all
注意事項
由於以上代碼執行的時候是需要sudo權限的,但是使用sudo執行的時候會重置環境變量,所以導致了一些錯誤。建議安裝的時候使用sudo -E
#-E選項在man page中的解釋是
-E
The -E (preserve environment) option indicates to the security policy that the user wishes to preserve their existing environment variables. The security policy may return an error if the -E option is specified and the user does not have permission to preserve the environment.
簡單來說,就是加上-E選項后,用戶可以在sudo執行時保留當前用戶已存在的環境變量,不會被sudo重置,另外,如果用戶對於指定的環境變量沒有權限,則會報錯。
但是實際安裝的時候發現,由於intel編譯器環境變量的問題,使得make install的時候發生icpc command not found錯誤,因此我認為最佳的方法是事先將編譯的目標文件夾權限設置好,然后直接執行上面的腳本,盡量避免使用sudo權限。另外在安裝的過程中,我發現上述的幾個庫有些在編譯鏈接的時候由於版本問題不能正常編譯,這里給出我的編譯包版本:
- szip-2.1.1.tar.gz
- zlib-1.2.11.tar.gz
- hdf5-1.10.4.tar.gz
- jpeg-9c-droppatch.tar.gz
- szip-2.1.1.tar.gz
- hdf-4.2.14.tar.gz
- netcdf-4.6.1.tar
- netcdf-fortran-4.4.4.tar.gz