安装步骤

yum install gcc //目前使用yum方式只能安装最高为4.8.5版本的
手动编译并安装gcc最新版本

提示:需要先有c编译器,和必要的c++库,否则后面会报错,可以等报错再回头看这里。
安装C编译器
$ yum install gcc //目前使用yum方式只能安装最高为4.8.5版本的

安装c++库

  1. $ yum install glibc-headers
  2. $ yum install gcc-c++

获取安装包并解压

gcc最新版本可以进http://ftp.gnu.org/gnu/gcc/ 查看
$ cd /opt //opt目录是给主机安装额外软件的目录 ,等会实际上不会装这个目录下
$ wget http://ftp.gnu.org/gnu/gcc/gcc-8.2.0/gcc-8.2.0.tar.gz //下载
$ tar -zxvf gcc-8.2.0.tar.gz //解压后的目录为/opt/gcc-8.2.0,即后面的${srcdir}

安装依赖包

安装gcc之前,需要安装几个依赖包。在gcc安装文件中,有个脚本可以帮我们自动下载、配置、安装依赖库

$ cd gcc-8.2.0 //进入解压后的目录
$ ./contrib/download_prerequisites //执行脚本
执行成功后显示以下语句:
gmp-6.1.0.tar.bz2: 确定
mpfr-3.1.4.tar.bz2: 确定
mpc-1.0.3.tar.gz: 确定
isl-0.18.tar.bz2: 确定
All prerequisites downloaded successfully.

建立目标目录

在/usr/local下建立目标目录,也就是编译后文件的存放目录
$ mkdir /usr/local/gcc-build-8.2.0 //即后面的${destdir}

生成Makefile文件

/如果没有可用的c编译器,下一步报错显示no acceptable C compiler found in ![](https://g.yuque.com/gr/latex?PATH%2F%0A%E7%BC%96%E8%AF%91%E6%A8%A1%E6%9D%BF%E8%AF%AD%E5%8F%A5%EF%BC%9AMakefile%E6%96%87%E4%BB%B6%0A#card=math&code=PATH%2A%2F%0A%E7%BC%96%E8%AF%91%E6%A8%A1%E6%9D%BF%E8%AF%AD%E5%8F%A5%EF%BC%9AMakefile%E6%96%87%E4%BB%B6%0A){srcdir}/configure —prefix=${destdir} [其它选项]

我这里在最新版本gcc安装 - 图1 cd /usr/local/gcc-build-8.2.0 //进入最新版本gcc安装 - 图2 /opt/gcc-8.2.0/configure -enable-checking=release -enable-languages=c,c++ -disable-multilib

执行完后会有四个文件
config.log config.status Makefile serdep.tmp

进行编译

在/usr/local/gcc-build-8.2.0目录下进行编译。
make //这个步骤可以先去干点别的,腾讯云最低配置机器花了大概三小时。
#建议使用单任务make,不要使用多任务,多任务有可能会编译报错。

如果报以下错误,就是缺少必要的c库,请看文章开头
configure: error: in `/usr/local/gcc-build-8.2.0/gcc’:
configure: error: C preprocessor “/lib/cpp” fails sanity check */

进行安装

在/usr/local/gcc-build-8.2.0目录下进行安装。
make install
最后使用gcc —version 查看gcc的版本:

更新系统使用的GCC版本

源码编译升级安装了gcc后,编译程序或运行其它程序时,有时会出现类似/usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.21’ not found的问题。这是因为升级gcc时,生成的动态库没有替换老版本gcc的动态库导致的,将gcc最新版本的动态库替换系统中老版本的动态库即可解决。

  1. 运行以下命令检查动态库
strings /usr/lib64/libstdc++.so.6 | grep GLIBC

输出结果如下:
GLIBCXX_3.4
GLIBCXX_3.4.1
GLIBCXX_3.4.2
GLIBCXX_3.4.3
GLIBCXX_3.4.4
GLIBCXX_3.4.5
GLIBCXX_3.4.6
GLIBCXX_3.4.7
GLIBCXX_3.4.8
GLIBCXX_3.4.9
GLIBCXX_3.4.10
GLIBCXX_3.4.11
GLIBCXX_3.4.12
GLIBCXX_3.4.13
GLIBCXX_3.4.14
GLIBCXX_3.4.15
GLIBCXX_3.4.16
GLIBCXX_3.4.17
GLIBCXX_3.4.18
GLIBCXX_3.4.19
GLIBC_2.3
GLIBC_2.2.5
GLIBC_2.14
GLIBC_2.4
GLIBC_2.3.2
GLIBCXX_DEBUG_MESSAGE_LENGTH
从以上输出可以看出,gcc的动态库还是旧版本的。说明出现这些问题,是因为升级gcc时,生成的动态库没有替换老版本gcc的动态库。

  1. 执行以下命令,查找编译gcc时生成的最新动态库
# find / -name "libstdc++.so*"

输出如下:
/usr/lib/vmware-tools/lib64/libstdc++.so.6
/usr/lib/vmware-tools/lib64/libstdc++.so.6/libstdc++.so.6
/usr/lib/vmware-tools/lib32/libstdc++.so.6
……
/usr/local/gcc-build-8.2.0/stage1-x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.25 //最新动态库
……

  1. 将上面的最新动态库libstdc++.so.6.0.25复制到/usr/lib64目录下
# cp /usr/local/gcc-build-8.2.0/stage1-x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.25 /usr/lib64
  1. 复制后,修改系统默认动态库的指向,即:重建默认库的软连接
    切换工作目录至/usr/lib64: # cd /usr/lib64/
    删除原来软连: # rm -rf libstdc++.so.6
    将默认库的软连接指向最新动态库:# ln -s libstdc++.so.6.0.25 libstdc++.so.6
  2. 默认动态库升级完成。重新运行以下命令检查动态库
# strings /usr/lib64/libstdc++.so.6 | grep GLIBC

现在输出如下
GLIBCXX_3.4
GLIBCXX_3.4.1
GLIBCXX_3.4.2
GLIBCXX_3.4.3
GLIBCXX_3.4.4
GLIBCXX_3.4.5
GLIBCXX_3.4.6
GLIBCXX_3.4.7
GLIBCXX_3.4.8
GLIBCXX_3.4.9
GLIBCXX_3.4.10
GLIBCXX_3.4.11
GLIBCXX_3.4.12
GLIBCXX_3.4.13
GLIBCXX_3.4.14
GLIBCXX_3.4.15
GLIBCXX_3.4.16
GLIBCXX_3.4.17
GLIBCXX_3.4.18
GLIBCXX_3.4.19
GLIBCXX_3.4.20
GLIBCXX_3.4.21
GLIBCXX_3.4.22
GLIBCXX_3.4.23
GLIBCXX_3.4.24
GLIBCXX_3.4.25
GLIBC_2.2.5
GLIBC_2.3
GLIBC_2.14
GLIBC_2.16
GLIBC_2.17
GLIBC_2.3.2
GLIBCXX_DEBUG_MESSAGE_LENGTH

  1. 这回切换到cmake所在目录,然后执行./ configure
# cd /opt/cmake-3.15.3/
# ./ configure

这回可以正常执行