Centos升级gcc并安装python3

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
  1. 如果系统未安装gcc,或gcc已经损坏、误删,需要先安装默认版本的gcc:
    sudo yum install gcc
    sudo yum install gcc-c++

  2. 下载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
    

    个人经验,上面两种方式下载速度巨慢,使用迅雷下载速度超快。

  3. 解压:

    tar -jxvf gcc-4.9.4.tar.bz2
    
  4. 在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
    
  5. 配置编译文件:

    ./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中去找各种文件。

  6. 编译安装

    make -j16 & sudo make install -j8
    
  7. 建立软连接:

    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
    
  8. 将新版gcc的库文件加入系统路径:

    export LD_LIBRARY_PATH=/usr/local/gcc-4.9.4/lib64:$LD_LIBRARY_PATH
    
  9. 最后测试gcc是否安装成功:

    gcc --version
    g++ --version
    
编译安装python3.6.5
  1. 从源码安装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
    
  2. 使用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中。

  1. 下载并解压python3.6.5源文件:
    https://www.python.org/downloads/source/

  2. 配置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

  3. 配置python的编译文件:

    ./configure --prefix=/usr/local/python3.6 --enable-optimizations --enable-shared --with-ssl
    

    显示的信息可能会报警告with-ssl是未知的配置,但是仍然需要这个参数,否则编译完的python3无法导入ssl模块,pip3也无法使用。

  4. 编译安装:

    make -j16 && sudo make install -j8
    

    Make的过程较长,可能需要多于50分钟。

  5. 添加路径:

    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

  6. 安装完成,建立软连接:

    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
    
  7. 测试是否安装成功:

    python3 –version
    pip3 –version
    
  8. 注意,此时使用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!

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值