Centos升级gcc并安装python3
近期需要运行一个基于pytorch的目标检测的库https://github.com/princeton-vl/CornerNet,而这个库某些文件需要使用pytorch的C++接口编译。
用系统默认的python和gcc,编译pytorch C++接口定义的层时,会报警告:Your compiler (c++) may be ABI-incompatible with PyTorch! Please use a compiler that is ABI-compatible with GCC 4.9 and above。虽然这个警告不会影响编译,但是使用编译后的库时,会导致core dump的cuda错误。
原因如下,使用pip安装的pytorch,预编译使用的编译器版本是gcc 4.9(及以上),而linux(本人使用的Centos7)中,使用yum安装的gcc(g++)版本是8.5,使用yum安装的python2和python3也是使用gcc 8.5编译的。
因此,如果需要使用pytorch的C++接口定义自己的层或者操作,并使用python安装时,需要升级gcc版本,并重新编译python。在经历了接近两周的折腾,填了无数个坑之后,总结出本文的方法,希望可以帮助大家解决类似的问题,节省时间。请注意,本文升级的是gcc 4.9.4,然后编译安装的是python3.6.5,其他版本的组合没有测试。
安装gcc
-
如果系统未安装gcc,或gcc已经损坏、误删,需要先安装默认版本的gcc:
sudo yum install gcc
sudo yum install gcc-c++ -
下载gcc 4.9.4源码,可以使用直接去https://ftp.gnu.org/gnu/gcc/gcc-4.9.4/点击下载gcc-4.9.4.tar.bz2,也可以使用
wget https://ftp.gnu.org/gnu/gcc/gcc-4.9.4/gcc-4.9.4.tar.bz2
个人经验,上面两种方式下载速度巨慢,使用迅雷下载速度超快。
-
解压:
tar -jxvf gcc-4.9.4.tar.bz2
-
在gcc-4.9.4文件夹中运行shell文件,下载并安装依赖文件:
sh contrib/download_prerequisites.sh
但是网络限制,下载一般不会成功,所以可以手动下载,放在gcc-4.9.4文件下。下载地址:ftp://gcc.gnu.org/pub/gcc/infrastructure/
依赖库及版本:mpfr-2.4.2.tar.bz2,gmp-4.3.2.tar.bz2,mpc-0.8.1tar.gz,isl-0.12.2.tar.bz2,cloog-0.18.1.tar.gz
解压并改名:
tar -jxvf mpfr-2.4.2.tar.bz2 tar -jxvf gmp-4.3.2.tar.bz2 tar -zxvf mpc-0.8.1.tar.gz tar -jxvf isl-0.12.2.tar.bz2 tar -zxvf cloog-0.18.1.tar.gz mv mpfr-2.4.2 mpfr mv gmp-4.3.2 gmp mv mpc-0.8.1 mpc mv isl-0.12.2 isl mv cloog-0.18.1 cloog
-
配置编译文件:
./configure --prefix=/usr/local/gcc-4.9.4 --enable-checking=release --enable-languages=c,c++ --disable-multilib
注意enable-languages一定要添加c++选项,不然编译完成后g++无法使用。pre-fix定义编译后的gcc库的安装位置,方便管理安装的库,避免到/usr/lib、/usr/bin中去找各种文件。
-
编译安装
make -j16 & sudo make install -j8
-
建立软连接:
sudo ln -s /usr/local/gcc-4.9.4/bin/gcc /usr/bin/gcc sudo ln -s /usr/local/gcc-4.9.4/bin/gcc++ /usr/bin/g++
注意,建立软连接之前,把系统默认的gcc和g++改名,或者直接删掉:
sudo yum remove gcc
-
将新版gcc的库文件加入系统路径:
export LD_LIBRARY_PATH=/usr/local/gcc-4.9.4/lib64:$LD_LIBRARY_PATH
-
最后测试gcc是否安装成功:
gcc --version g++ --version
编译安装python3.6.5
-
从源码安装python3有些复杂,需要安装非常多的依赖,需要仔细操作。首先yum安装一部分依赖:
sudo yum install -y ncurses-libs zlib-devel mysql-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel tkinter libffi-devel python3-devel
-
使用yum安装的tkinter是python2.7版本的,安装python3版本的tkinter需要从源码编译,如果不安装,编译完python3后,使用时,会报错:no module _tkinter。另外,还需要X11,如果不编译安装X11,使用python3时会报错:error while loading shared libraries: libXss.so.1: cannot open shared object file: No such file or directory。参考https://blog.csdn.net/may0324/article/details/84590174之后,成功完成编译。
-
首先从https://www.activestate.com/products/activetcl/downloads/下载ActiveTcl,该库包含了tk和tcl,不需要分别下载并编译两个库,方便使用。编译过程是经典三部曲:
./configure --pre-fix=/usr/local/3rd/ActiveTcl && make && sudo make install
建议将本步骤安装的所有依赖都安装在/usr/local/3rd/下,方便管理。
-
安装X11前先安装一些依赖包,xcb(依赖xcb-proto、xau和pthread-stubs)、xproto、xextproto、xtrans、inputproto、kbproto,这些依赖包都可以在官网https://www.x.org/releases/X11R7.7/src/everything/找到并下载。安装过程依然是经典三部曲,
./configure –pre-fix=/usr/local/3rd/xxx && make && sudo make install
-
安装完成后,在指定目录下会生成对应的pkgconfig目录,建议将上述包的目录都写入PKG_CONFIG_PATH环境变量中:
export PKG_CONFIG_PATH=/usr/local/3rd/xproto/lib/pkgconfig/:/usr/local /3rd/xextproto/lib/pkgconfig/:/usr/local/3rd/xtrans/share/pkgconfig/:/usr/local /3rd/kbproto/lib/pkgconfig/:/usr/local/3rd/inputproto/lib/pkgconfig/:/usr/local/3rd/xcb-proto/lib/pkgconfig/:/usr/local/3rd/pthread-stubs/lib/pkgconfig/:/usr/local/3rd/xau/lib/pkgconfig/:/usr/local/3rd/xcb/lib/pkgconfig/:$PKG_CONFIG_PATH
-
上述安装包安装完毕后,安装X11,在http://sources.endlessm.com/debian/pool/core/libx/libx11/下载libx11_1.6.2.orig.tar.gz,依旧是安装三部曲。
-
最后安装libXScrnSaver-1.2.2-6.1.el7.x86_64.rpm
rpm -ivh libXScrnSaver-1.2.2-6.1.el7.x86_64.rpm
安装完成后在/usr/lib64下会生成libXss.so.1,并将/usr/lib64写入环境变量LD_LIBRARY_PATH中。
-
下载并解压python3.6.5源文件:
https://www.python.org/downloads/source/ -
配置Python3.6.5/Modules/Setup.dist,使其可以找到上边安装的依赖库文件,将相应的命令去掉注释,并修改为相应的安装位置:
_tkinter _tkinter.c tkappinit.c -DWITH_APPINIT \
-L/usr/local/3rd/ActiveTcl/lib \
-I/usr/local/3rd/ActiveTcl/include \
-I/usr/local/3rd/X11/include \
-I/usr/xxx/3rd/xproto/include \
-ltk8.5 -ltcl8.5 \ #取消注释 根据下载的库版本填写
-L/usr/local/3rd/X11/lib
-lX11 -
配置python的编译文件:
./configure --prefix=/usr/local/python3.6 --enable-optimizations --enable-shared --with-ssl
显示的信息可能会报警告with-ssl是未知的配置,但是仍然需要这个参数,否则编译完的python3无法导入ssl模块,pip3也无法使用。
-
编译安装:
make -j16 && sudo make install -j8
Make的过程较长,可能需要多于50分钟。
-
添加路径:
export LD_LIBRARY_PATH=/usr/local/python3.6/lib:$LD_LIBRARY_PATH
若不添加,可能导致error while loading shared libraries: libpython3.6.so.1.0: cannot open shared object file: No such file or directory
-
安装完成,建立软连接:
sudo ln -s /usr/local/python3.6/bin/python3.6 /usr/bin/python3 sudo ln -s /usr/local/python3.6/bin/pip3.6 /usr/bin/pip3
-
测试是否安装成功:
python3 –version pip3 –version
-
注意,此时使用sudo pip3 install时,仍会发生错误 while loading shared libraries: libpython3.6.so.1.0: cannot open shared object file: No such file or director。可以在/etc/ld.so.conf中,添加路径/usr/local/python3.6/lib,并ldconfig。
至此,gcc4.9.4和python3.6.5安装完毕。Enjoy!