#更新 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装好了。为了以后避免重蹈覆辙,特定记录下安装过程。
一 、各个包依赖关系
特别说明:最好将软件安装到统一路径下(除非同一个软件要安装几个不同版本),因为编译时候指定自定义的库的路径实在太?
二、软件编译顺序
编译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