hdf4 hdf5 netcdf eccodes 安裝過程實錄


#更新 2019年6月16日# 最近在服務器上安裝了一些軟件,再次體驗了一遍“dependency hell”,不過比之前順利不少。有一些心得體會:

1 由於一些庫是依賴於特定的C/C++,Fortran編譯器的,因此,需要將基於相同編譯環境的庫放在相同的目錄下,比如基於PGI的編譯器的庫放在一個文件夾下,而基於Intel編譯器的庫放在另一個文件夾下

2 在編譯一個庫時候,經常要指定依賴庫的頭文件和庫文件的具體路徑,有時候編譯一個庫依賴好幾個庫,需要把每一條路徑都寫明,如。

export CPPFLAGS='-I/opt/app/intel/zlib-1.2.11/include -I/opt/app/intel/libpng-1.6.30/include'
export LDFLAGS='-L/opt/app/intel/zlib-1.2.11/lib -L/opt/app/intel/libpng-1.6.30/lib'

 

如果安裝所需要的每一個庫都放在不同的文件夾內(如上面的情況),那么當依賴的庫增多時,CPPFLAGS和LDFLAGS這兩個變量將會變得非常長,而且容易疏漏。所以建議安裝庫的時候,建議把相同編譯環境下產生的庫放在同一個文件夾下面,不需要再單獨以庫的名字再命名一級,除非一個編譯環境下面需要安裝好幾個不同版本的庫。(或者在上一級目錄下鏈接所有的庫文件?)

3 關於sudo,sudo命令是以root身份執行命令,采用的環境變量是和常規用戶不同的,所以有時候sudo ./configure 和./configure時候的結果並不一樣。通常,只有在執行make install命令之前加sudo,其余時候不用加。

4 關於編譯器的選項設置,在需要指定編譯器時,需要設置一些環境變量,用於指定編譯器,如

#指定C編譯器
export CC=icc

#指定C++編譯器
export CXX=icpc

#指定Fortran編譯器
export FC=ifort
export F77=ifort
export F9X=ifort

 

在./configure時候,有時候編譯器選項還需要設置,如

#第三級優化,實現一共享對象。參見https://www.cnblogs.com/cswuyg/p/3830703.html

export CFLAGS="-O3 -fPIC"
export FCFLAGS="-O3 -fPIC"
export CXXFLAGS="-O3 -fPIC"

 

 在安裝hdf4,hdf5的時候,需要指定一些庫的路徑,如:--with-zlib=... 

5 關於CMAKE編譯,CMAKE編譯庫一般是在安裝包里面的build文件夾里編譯的(外部編譯),cmake編譯選項的設置一般是“-D”+“要設置的變量”=“值”,如 -DCMAKE_INSTALL_PREFIX=/opt/app/pgi 表示指定安裝在/opt/app/pgi路徑下。如果要設置一些庫的位置,一般的變量是“-D”+“庫名稱”+“_ROOT"或”_PATH"或“_DIR”,如

-DOPENJPEG_ROOT=/mnt/d/WSL/app/openjpeg-2.3.0  -DHDF5_ROOT=/mnt/d/WSL/app/hdf5-1.8.19 -DOPENJPEG_INCLUDE_DIR=/mnt/d/WSL/app/openjpeg-2.3.0/include/openjpeg-2.3 

 

但實際情況需要參照安裝包內的說明文件指定

在安裝eccodes時,如果要指定python編譯器,可以這樣設置 -DPYTHON_EXECUTABLE=/usr/bin/python3 

 另外CMAKE內置了一些常用庫的搜索模塊(參見https://cmake.org/cmake/help/v3.0/manual/cmake-modules.7.html),用於在安裝時候搜索一些庫的路徑,但是有時候設置了未必能正確找到需要的路徑,這個時候需要參考一下cmake的官方文檔,正確設置相應的變量。 

6 which命令用於查看執行命令的程序的具體路徑,比如,我已經在python3上安裝好了一些函數庫,可是執行腳本時候卻提示import Error,找不到庫,這個時候就需要考慮是否使用指定的python運行。輸入which python3,結果如下

abc@dell:~$ which python3
/opt/intel/intelpython3/bin/python3
abc@dell:~$ python3 tst.py 
Traceback (most recent call last):
  File "tst.py", line 3, in <module>
    import netCDF4
ModuleNotFoundError: No module named 'netCDF4'
abc@dell:~$which python3 /opt/intel/intelpython3/bin/python3

 

發現使用的python是intel的python,並非需要的python,這時候需要更改環境變量,將需要的python路徑(比如是/usr/bin)放在PATH變量的最前面的位置 export PATH=/usr/bin:$PATH 

 


 分割線


編譯軟件一直是氣象學生的一個噩夢,各種復雜的依賴關系讓人陷入“dependency hell”。每一次換一個編譯系統,更改一個庫,影響都是“牽一發而動全身”的。IAP董理老師開發的一個包管理軟件starman給廣大氣象工作者帶來了福音。因為是針對常用環境配置的,不可能對特定的系統都完美的支持。所以遇到這種情況還是不可避免的,自己從源碼一步一步的安裝。最近經過反復折騰,終於在ubuntu18.04LTS上將eccodes裝好了。為了以后避免重蹈覆轍,特定記錄下安裝過程。

一 、各個包依賴關系

EC軟件安裝順序(從左到右),每安裝一個軟件,需要加入環境變量!
中間還需要安裝一系列庫(以前安裝apt)
pango -dev expat fftw3-dev boost(需要1.5的版本) proj4 libgdbm ...
eccodes -> emoslib -> magic+ ->metview
eccodes是grib_api的下一代產品。 其中eccodes可以選裝openjpeg包。eccodes 不支持python3,但支持windows(僅限C接口)。gribapi支持python3,但是即將停止維護
=======================================================

特別說明:最好將軟件安裝到統一路徑下(除非同一個軟件要安裝幾個不同版本),因為編譯時候指定自定義的庫的路徑實在太😭

二、軟件編譯順序

 

編譯Jasper

cd /mnt/d/WSL/app/jasper-2.0.14
mkdir build
cd build/
cmake .. -DCMAKE_INSTALL_PREFIX=/mnt/d/WSL/app/jasper-2.0.14
make
make check
make install

 

編譯zlib

cd zlib-1.2.11/
./configure --prefix=/mnt/d/WSL/app/zlib-1.2.11
make
make install

 

編譯libpng

cd libpng-1.6.35/
./configure --prefix=/mnt/d/WSL/app/libpng-1.6.35
make
make check
make install

 

編譯szip

cd /mnt/d/WSL/packages/szip-2.1.1/
autoconf -i
./configure --prefix=/mnt/d/WSL/app/szip-2.1.1
make
make install

 

編譯jpeg 

cd jpeg-9b/
./configure --prefix=/mnt/d/WSL/app/jpeg-9b
make
make install

 

 

編譯hdf4 (用./configure 編譯的,下面是在另外一台機器上測試的,命令不同,如果需要自定義編譯器,則需要設置CC和F77這兩個變量https://portal.hdfgroup.org/pages/viewpage.action?pageId=48809925)

cd hdf-4.2.13/
cd build/
./configure --prefix=/opt/app/gnu/hdf-4.2.13 --with-zlib=/opt/app/gnu/zlib-1.2.11 --with-szlib=/opt/app/gnu/szip-2.1.1 --disable-netcdf --enable-fortran --enable-static
make make install

 

編譯hdf5

cd /mnt/d/WSL/packages/hdf5_gcc_7.3.0/
cd hdf5-1.10.1/
./configure --prefix=/mnt/d/WSL/app/hdf5-1.10.1 \
--with-szlib=/mnt/d/WSL/app/szip-2.1.1 \
--with-jasper=/mnt/d/WSL/app/jasper-2.0.14 \
--enable-fortran make install

 

編譯netcdf-c-4.6.0。需要指定一些庫的路徑。

注:--with-hdf-path等等設置在configure是無效的。應該設置CPPFLAGS和LDFLAGS,有時候要設置LD_LIBRARY_PATH 

https://www.unidata.ucar.edu/support/help/MailArchives/netcdf/msg13261.html

 

cd /netcdf-4.6.0
CPPFLAGS='-I/mnt/d/WSL/app/hdf5-1.10.1/include -I/mnt/d/WSL/app/jpeg-9b/include \
-I/mnt/d/WSL/app/zlib-1.2.11/include -I/mnt/d/WSL/app/szip-2.1.1/include \
-I/mnt/d/WSL/app/hdf-4.2.13/include -I/mnt/d/WSL/app/jasper-2.0.14/include/jasper \
-I/mnt/d/WSL/app/libpng-1.6.35/include -I/mnt/d/WSL/app/openjpeg-2.3.0/include/openjpeg-2.3‘ \
LDFLAGS='-L/mnt/d/WSL/app/hdf5-1.10.1/lib -L/mnt/d/WSL/app/jpeg-9b/lib \
-L/mnt/d/WSL/app/zlib-1.2.11/lib -L/mnt/d/WSL/app/hdf-4.2.13/lib \
-L/mnt/d/WSL/app/szip-2.1.1/lib -L/mnt/d/WSL/app/jasper-2.0.14/lib \
-L/mnt/d/WSL/app/libpng-1.6.35/lib -L/mnt/d/WSL/app/openjpeg-2.3.0/lib ' \ ./configure --prefix=/mnt/d/WSL/app/netcdf4 \ --disable-doxygen --disable-fsync --disable-valgrind-tests \
--disable-parallel4 --disable-dap-remote-tests \ --disable-pnetcdf --disable-ffio \
--disable-filter-testing --disable-parallel-tests \
--disable-testsets --enable-netcdf-4 \
--enable-hdf4-file-tests --enable-logging \
--enable-cdf5 --enable-extra-example-tests\ --enable-dap --enable-dap-long-tests \
--enable-extra-tests --enable-examples \
--enable-v2 --enable-utilities \ --enable-large-file-tests --enable-benchmarks \
--enable-extreme-numbers --enable-shared \
--enable-static --enable-largefile --enable-mmap --with-zlib=/mnt/d/WSL/app/zlib-1.2.11 \ --with-szlib=/mnt/d/WSL/app/szip-2.1.1 \ --with-hdf4=/mnt/d/WSL/app/hdf-4.2.13 \ --with-hdf5=/mnt/d/WSL/app/hdf5-1.10.1 \ --with-jpeg=/mnt/d/WSL/app/jpeg-9b \ --with-jasper=/mnt/d/WSL/app/jasper-2.0.14 \ --with-libpng=/mnt/d/WSL/app/libpng-1.6.35 \ --with-openjpeg=/mnt/d/WSL/app/openjpeg-2.3.0 make install

 

 

編譯netcdf-cxx-4.2,netcdf-cxx4.3.0,netcdf-fortran-4.4.4:均和編譯netcdf-c庫的命令類似,但還需要加入已經編譯好的netcdf-c庫的路徑。

cd /netcdf-cxx4.3.0

CPPFLAGS='-I/mnt/d/WSL/app/hdf5-1.10.1/include -I/mnt/d/WSL/app/jpeg-9b/include \

-I/mnt/d/WSL/app/zlib-1.2.11/include -I/mnt/d/WSL/app/szip-2.1.1/include \
-I/mnt/d/WSL/app/hdf-4.2.13/include -I/mnt/d/WSL/app/jasper-2.0.14/include/jasper \
-I/mnt/d/WSL/app/libpng-1.6.35/include -I/mnt/d/WSL/app/openjpeg-2.3.0/include/openjpeg-2.3 \
-I/mnt/d/WSL/app/netcdf4/include' \
LDFLAGS='-L/mnt/d/WSL/app/hdf5-1.10.1/lib -L/mnt/d/WSL/app/jpeg-9b/lib \
-L/mnt/d/WSL/app/zlib-1.2.11/lib -L/mnt/d/WSL/app/hdf-4.2.13/lib \
-L/mnt/d/WSL/app/szip-2.1.1/lib -L/mnt/d/WSL/app/jasper-2.0.14/lib \
-L/mnt/d/WSL/app/libpng-1.6.35/lib -L/mnt/d/WSL/app/openjpeg-2.3.0/lib \
-L/mnt/d/WSL/app/netcdf4/lib ' \

./configure --prefix=/mnt/d/WSL/app/netcdf4 \

--disable-doxygen --disable-fsync --disable-valgrind-tests \

--disable-parallel4 --disable-dap-remote-tests \

--disable-pnetcdf --disable-ffio \

--disable-filter-testing --disable-parallel-tests \

--disable-testsets --enable-netcdf-4 \
--enable-hdf4-file-tests --enable-logging \
--enable-cdf5 --enable-extra-example-tests\ --enable-dap --enable-dap-long-tests \
--enable-extra-tests --enable-examples \
--enable-v2 --enable-utilities \ --enable-large-file-tests --enable-benchmarks \
--enable-extreme-numbers --enable-shared \
--enable-static --enable-largefile --enable-mmap --with-zlib=/mnt/d/WSL/app/zlib-1.2.11 \

--with-szlib=/mnt/d/WSL/app/szip-2.1.1 \

--with-hdf4=/mnt/d/WSL/app/hdf-4.2.13 \

--with-hdf5=/mnt/d/WSL/app/hdf5-1.10.1 \

--with-jpeg=/mnt/d/WSL/app/jpeg-9b \

--with-jasper=/mnt/d/WSL/app/jasper-2.0.14 \

--with-libpng=/mnt/d/WSL/app/libpng-1.6.35 \

--with-openjpeg=/mnt/d/WSL/app/openjpeg-2.3.0

make install

 

編譯 eccodes-2.9.2

cd eccodes-2.9.2-Source/
cd build/
cmake .. -DCMAKE_INSTALL_PREFIX=/mnt/d/WSL/app/eccodes-2.9.2 -DJASPER_PATH=/mnt/d/WSL/app/jasper-2.0.14 -DHDF5_ROOT=/mnt/d/WSL/app/hdf5-1.10.1 -DNETCDF_PATH=/mnt/d/WSL/app/netcdf4 -DHDF4_ROOT=/mnt/d/WSL/app/hdf-4.2.13
make
make install

 

三、其他

一些包的安裝沒有用默認命令,而是用apt包管理器安裝的。

sudo apt install git
sudo apt install make
sudo apt install libtool-bin
sudo apt install g77
sudo apt install openssl
sudo apt install ssh
sudo apt install libssh2
sudo apt install ssh2
sudo apt install libtool libtool-ltdl libtool-ltdl-devel
sudo apt install cmake
sudo apt install apt-transport-https ca-certificates curl software-properties-common
sudo apt install libssh2-1-dev
sudo apt install libssl-dev
sudo apt install libcurl-dev
sudo apt install libcurl4-openssl-dev 
sudo apt-key fingerprint 0EBFCD88
sudo apt install libxrender-dev
sudo apt install libfontconfig1-dev 
sudo apt install gcc gfortran g++
sudo apt install libgfortran3
sudo apt install csh tcsh
sudo apt install python3
sudo apt install python3-pip
sudo apt install python-pip
sudo apt install python3-mpltoolkits.basemap
sudo apt install unzip
sudo apt install ruby
sudo apt install sqlite3
sudo apt install libsqlite3-dev
sudo apt install sqlite
sudo apt install ruby-dev
sudo apt install libkmod-dev
sudo apt install libpango1.0-dev
sudo apt install alsa
sudo apt install xserver-xorg x11-xserver-utils
sudo apt install libstdc++
sudo apt install libxml2-dev
sudo apt install flex
sudo apt install libopenjp2-7-dev libopenjp3d7
sudo apt install jpeg 
sudo apt install libjasper
pip3 install Numpy
pip3 install python-devel
pip3 install matplotlib
pip3 install scipy
pip3 install pandas
pip3 install basemap
pip install numpy

 

 

安裝codes_ui 參考https://confluence.ecmwf.int/display/METV/CodesUI+-+Installation+guide

需要安裝qt 的一些庫,否則cmake無法通過

sudo apt install qt5-default

sudo apt install libqt5xmlpatterns5-dev

sudo apt install libqt5svg5-dev


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM