linux升级gcc

情景如下:

  • CentOS7, python3, 以及python3的pip(命名为pip3)

  • 执行 pip3 install sxtwl 时,报错: 省略N字......-std=c11 , 总之就是不支持-std=c11

  • 查阅资料,需要升级gcc,yum只到4.8.5版本, 只好编译安装, 目前最新已经9.x了, 我下载的6.1.0

下载gcc源码

yum -y install bzip2.x86_64   
  • 解压
tar -jxvf gcc-6.1.0.tar.bz2

下载供便利需要的依赖项

cd gcc-6.1.0

./contrib/download_prerequisites 

sudo yum install  gmp  gmp-devel  mpfr  mpfr-devel  libmpc  libmpc-devel

建立一个目录供编译出的文件存放

mkdir gcc-build-6.1.0

cd gcc-build-6.1.0

生成Makefile文件

../configure -enable-checking=release -enable-languages=c,c++ -disable-multilib

编译安装

make -j4
  • -j4选项是make对多核处理器的优化,如果不成功请使用 make,这里我使用的make

  • (注意:此步骤如果能正常运营,则非常耗时,在我写这篇文章时,已经过40分钟了,还没完成。如果有错误的话,一般最多一两分钟就停下来了)

  • PS:如果提示还缺少其它包,请下载错误提示中包后,重新编译

比如在这个过程中,我又执行了如下两个命令安装相关依赖
yum install m4 
yum install gcc-c++
  • 再次 make

  • make install

  • 重启 ,执行 gcc -v查看版本 已经6.1.0,可以使用了

替换老版本gcc动态库

  • 源码编译升级安装了gcc后,编译程序或运行其它程序时,有时会出现类似/usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.21' not found的问题。这是因为升级gcc时,生成的动态库没有替换老版本gcc的动态库导致的,将gcc最新版本的动态库替换系统中老版本的动态库即可解决。
find / -name "libstdc++.so*"
  • 结果如下:
/usr/lib/gcc/x86_64-redhat-linux/4.8.2/32/libstdc++.so
/usr/lib/gcc/x86_64-redhat-linux/4.8.2/libstdc++.so
/usr/lib64/libstdc++.so.6
/usr/lib64/libstdc++.so.6.0.19
/usr/share/gdb/auto-load/usr/lib64/libstdc++.so.6.0.19-gdb.py
/usr/share/gdb/auto-load/usr/lib64/libstdc++.so.6.0.19-gdb.pyc
/usr/share/gdb/auto-load/usr/lib64/libstdc++.so.6.0.19-gdb.pyo
/usr/local/lib64/libstdc++.so.6.0.22
/usr/local/lib64/libstdc++.so.6
/usr/local/lib64/libstdc++.so
/usr/local/lib64/libstdc++.so.6.0.22-gdb.py

  • 删除并备份原文件 (注意:每个人的文件路径可能稍有差异,但文件名是一样的 )
mv /usr/lib64/libstdc++.so.6 /home/usr_lib64_libstdc++.so.6
  • 将新版本gcc动态库导入
ln -s /usr/local/lib/libstdc++.so.6.0.22 /usr/lib64/libstdc++.so.6

  • 重新编译运行

  • 此时在执行 pip install sxtwl 就能正常安装了

原文地址:https://www.cnblogs.com/lz0925/p/10967882.html