(如果原机器上gcc版本太低,推荐先升级gcc)
1. gcc包依赖于gmp、mpfr和mpc这3个包,需要首先安装这3个包才能安装gcc4.7.0。
其中mpfr依赖gmp包,mpc包又依赖gmp和mpfr,所以这三个包的安装顺序应当严格遵循gmp–>mpfr–>mpc的顺序。
本例中选择的是gmp5.0.1、mpfr2.4.2和mpc0.9.
2. 安装完gmp、mpfr和mpc之后,就可以安装gcc了。
首先将,gmp、mpfr和mpc的lib路径写入LD_LIBRARY
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/mpc-0.9/lib:/usr/local/gmp-5.0.1/lib:/usr/local/mpfr-2.4.2/lib
然后采用如下的configure进行编译
./configure --prefix=${HOME}/local --enable-threads=posix --disable-checking --enable--long-long --disable-multilib --with-gmp=${HOME}/local --with-mpfr=${HOME}/local --with-mpc=${HOME}/local (这里的路径取决于之前安装几个包时选定的prefix路径)
注意:由于开发机没有安装32位的lib库,所以一定要加 –disable-multilib,否则会报错说找不到某个文件
然后在$HOME/tools/bin下为刚编译好的gcc g++ gfortran做链接,方便之后的程序调用。
3. 要安装scipy,需要先安装BLAS,BLAS是一个线性代数计算库标准,它有多种实现,使用ATLAS可以编出BLAS和LAPACK,但是不是很靠谱(在编numpy时一直失败),我就直接自己编译了BLAS
安装过程如下:
mkdir -p ~/src/ cd ~/src/ wget http://www.netlib.org/blas/blas.tgz --no-check-certificate tar xzf blas.tgz cd BLAS ## NOTE: The selected fortran compiler must be consistent for BLAS, LAPACK, NumPy, and SciPy.## For GNU compiler on 32-bit systems:#g77 -O2 -fno-second-underscore -c *.f # with g77#gfortran -O2 -std=legacy -fno-second-underscore -c *.f # with gfortran## OR for GNU compiler on 64-bit systems:#g77 -O3 -m64 -fno-second-underscore -fPIC -c *.f # with g77 gfortran -O3 -std=legacy -m64 -fno-second-underscore -fPIC -c *.f # with gfortran## OR for Intel compiler:#ifort -FI -w90 -w95 -cm -O3 -unroll -c *.f # Continue below irrespective of compiler: ar r libfblas.a *.o ranlib libfblas.a rm -rf *.o export BLAS=~/src/BLAS/libfblas.a mkdir -p ~/src cd ~/src/ wget http://www.netlib.org/lapack/lapack.tgz --no-check-certificate tar xzf lapack.tgz cd lapack-*/ cp INSTALL/make.inc.gfortran make.inc # on Linux with lapack-3.2.1 or newer
打开make.inc,在make.inc之后添加OPTS = -O2 -fPIC and NOOPT = -O0 -fPIC,这两个参数的作用是强制使用相对路径。
make lapacklib
make clean
export LAPACK=~/src/lapack-*/liblapack.a
注意,BLAS和lapack要使用同一个fortran编译器编译,
4. 安装numpy
直接装numpy时可能报error“unrecognizable insn”,这是gcc的一个bug,是由gcc的版本过低造成的
解决办法:
在numpy/core/src/multiarray/einsum.c.src文件中,在ifdef之后添加如下代码:
/* * TODO: Only some SSE2 for float64 is implemented. */ #ifdef NPY_HAVE_SSE2_INTRINSICS #define EINSUM_USE_SSE2 1 #else #define EINSUM_USE_SSE2 0 #endif //change begin #define EINSUM_USE_SSE1 0 #define EINSUM_USE_SSE2 0 //change end
5.
wget http://sourceforge.net/projects/scipy/files/scipy/0.14.0/scipy-0.14.0.tar.gz --no-check-certificate tar zxvf scipy-0.14.0.tar.gz cd scipy-0.14.0 python setup.py install --prefix=${HOME}/local
至此,scipy编译完成。
6.
下载sklearn(scikit-learn-master)的官方代码包,然后python setup.py install –prefix=${HOME}/local 即可。
最后在此鸣谢宋鑫同学对本文的帮助。