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这两个变量将会变得非常长,而且容易疏漏。所以建议安装库的时候,建议把相同编译环境下产生的库放在同一个文件夹下面,不需要再单独以库的名字再命名一级,除非一个编译环境下面需要安装好几个不同版本的库。(或者在上一级目录下链接所有的库文件?)

##(20210916更新)对于安装了多个并行库(如openmpi,mpich)的情况,则不建议采用上述方法(即把所有的库都安装在同一个文件夹),而建议根据所依赖的并行库进行分类,单独放在一个文件夹下面(比如将所有的编译时候用到openmpi的库放在一个文件夹,所有的编译时候用到mpich的库放到另一个文件夹)。参见https://community.intel.com/t5/Intel-Fortran-Compiler/undefined-symbol-libm-feature-flag/m-p/1076408#M120605

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 需要enable shared , 加上-fPIC

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

 

 
编译jpeg 

需要在configure里面加上expat的库的路径,否侧会出现错误:

checking for library containing XML_StopParser... no
configure: error: cannot find EXPAT function XML_StopParser

CPPFLAGS="-I/xxxx/include" LDFLAGS="-L/xxxx/lib" CFLAGS="-fPIC" ./configure --prefix=/xxxxl --enable-shared --with-zlib-include-dir=/xxxxl/include --with-zlib-lib-dir=/xxxx/lib --with-jpeg-include-dir=/xxxxl/include --with-jpeg-lib-dir=/xxxx/lib

 

 

编译hdf4 (用./configure 编译的,下面是在另外一台机器上测试的,命令不同,如果需要自定义编译器,则需要设置CC和F77这两个变量https://portal.hdfgroup.org/pages/viewpage.action?pageId=48809925)

(#20210101 #注意:编译时候需要开启动态库的编译 --enable-shared,否则后面netcdf-c库可能无法安装)

(#20210816 #注意:编译时动态库的编译和fortran, netcdf 特性互斥,要实现shared特性,还需要 --disable-fortran --disable-netcdf)

(#20220709 #注意:有时候因为环境变量的原因,在用sudo make install编译时候会提示“libtool: error: error: relink 'libhdf5_fortran.la' with the above command before installing it",这个时候直接切换到管理员账户,再重新加载intel编译器脚本就可运行!)

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

为了使得netcdf得以编译成功,还需要加入--with-default-api-version=v18

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 \
--disable-fortran
--with-default-api-version=v18
make install

 

编译netcdf-c-4.6.0。需要指定一些库的路径。

注:--with-hdf-path等等设置在configure是无效的。应该设置CPPFLAGS和LDFLAGS,并且需要--enable-hdf4, 有时候要设置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

 
#20220727 注意 很多时候按照错误是由于库的路径索引错误,对于netcdf等库,可能会被安装在lib64文件夹下,而不是lib文件夹下,往往索引的时候忘记了导致编译失败

#20220726 注意 #gdal库的安装需要netcdf4的支持 https://github.com/qgis/QGIS/issues/29324

 

编译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

 

三、其他

注: 一些软件包如果安装库的话,需要添加-fPIC选项表示位置无关,否则编译其他软件时候,会出现"relocation R_X86_64_32 against `.rodata' can not be used "报错。比如,在安装curl的时候,依赖的openssl库在编译时候没有设置-fPIC,导致curl编译失败。最后是在openssl的Makefile中的CFLAG(没有S)中强制添加了-fPIC选项,重新编译openssl,然后再编译curl。

 

一些包的安装没有用默认命令,而是用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

 

#20220726#gdeos源码 安装

configure的时候需要指定python解释器 比如./configure -with-python=/opt/anaconda3/bin/python3 --enable-python

 

#20220726#gdal源码 安装

注意,如果以后需要使用gdal_merge.py等python脚本,那么configure的时候需要指定python解释器 比如./configure -with-python=/opt/anaconda3/bin/python3 --enable-python

 

#20220726#convert_geotif安装  https://github.com/openwfm/convert_geotiff/releases/download/v0.1/convert_geotiff-0.1.0.tar.gz

注意。configure的时候需要制定库的路径 CPPFLAGS="-I/usr/local/include" LDFLAGS="-L/usr/local/lib -L/lib64 -L/usr/lib64 -lm" ./configure

这个-lm至关重要,不加的话可能会出现错误 undefined reference to symbol 'ceil@@GLIBC_2.2.5'

posted @ 2017-07-09 16:13  chinagod  阅读(6628)  评论(0编辑  收藏  举报