hdf4 hdf5 netcdf eccodes 安装过程实录

呼延运恒
2023-12-01

#更新 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。需要指定一些库的路径。

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

 

转载于:https://www.cnblogs.com/jiangleads/p/9820464.html

 类似资料: