#更新 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。需要指定一些庫的路徑。
注:--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