Centos 7默认gcc版本为4.8,有时需要更高版本的,这里以升级至8.3.1版本为例(升级gcc7系列也是类似的步骤),分别执行下面三条命令即可,无需手动下载源码编译

1、安装centos-release-scl

sudo yum install centos-release-scl

2、安装devtoolset,注意,如果想安装7.*版本的,就改成devtoolset-7-gcc*,以此类推

sudo yum install devtoolset-8-gcc*

3、激活对应的devtoolset,所以你可以一次安装多个版本的devtoolset,需要的时候用下面这条命令切换到对应的版本

scl enable devtoolset-8 bash

大功告成,查看一下gcc版本

gcc -v

显示为 gcc version 8.3.1 20190311 (Red Hat 8.3.1-3) (GCC)

补充:这条激活命令只对本次会话有效,重启会话后还是会变回原来的4.8.5版本,要想随意切换可按如下操作。

首先,安装的devtoolset是在 /opt/rh 目录下的,如图

每个版本的目录下面都有个 enable 文件,如果需要启用某个版本,只需要执行

source ./enable

所以要想切换到某个版本,只需要执行

source /opt/rh/devtoolset-8/enable

可以将对应版本的切换命令写个shell文件放在配了环境变量的目录下,需要时随时切换,或者开机自启

4、直接替换旧的gcc

旧的gcc是运行的 /usr/bin/gcc,所以将该目录下的gcc/g++替换为刚安装的新版本gcc软连接,免得每次enable

mv /usr/bin/gcc /usr/bin/gcc-4.8.5     【备份旧的gcc】

ln -s /opt/rh/devtoolset-8/root/bin/gcc /usr/bin/gcc    【替换为新的gcc软链接】

mv /usr/bin/g++ /usr/bin/g++-4.8.5    【备份旧的g++】

ln -s /opt/rh/devtoolset-8/root/bin/g++ /usr/bin/g++   【替换为新的g++软链接】

gcc --version

g++ --version

编译安装gcc4.9.1 - gcc5xxx

一、安装开发必备环境:

yum groupinstall "Development Tools"
yum install glibc-static libstdc++-static

二、编译安装gcc-4.9.4

你可以到官网下载gcc,也可以直接在这里下载:Index of /software/gcc/releases  下载好后进行编译安装:

wget  http://ftp.tsukuba.wide.ad.jp/software/gcc/releases/gcc-4.9.4/gcc-4.9.4.tar.gz

tar -zxvf gcc-4.9.4.tar.gz
cd gcc-4.9.4
./contrib/download_prerequisites
mkdir build
cd build
../configure --enable-checking=release --enable-languages=c,c++ --disable-multilib
make(建议不要使用make -j来编译,虽然可以缩短编译时间,但极大可能会编译失败)
make install

其中执行 ./contrib/download_prerequisits 将自动下载以下几个文件,这个几个文件在gcc编译时需要:

  • mpfr-2.4.2.tar.bz2
  • gmp-4.3.2.tar.bz2
  • mpc-0.8.1.tar.gz
  • isl-0.15.tar.bz2

由于网络条件不是很好,在下载这几个文件时很久都下载不下来,所以我中断了很多次,并删除下载了的文件,重新执行./contrib/download_prerequisits命令,下载完成后在configure时配置一些选项,我没有使用--prefix,在make install时将自动安装到/usr/local/bin下,编译过程十分漫长,我的笔记本用了两三个小时,公司的电脑只用了一个小时,编译安装在完成后需要重启电脑:

init 6

重起后就可以通过gcc -v来查看gcc版本,现在已经是4.9.4了。

三、测试【有坑,踩平】

所以我决定写一个小程序来测试一下,编译程序没有问题,但是运行的时候出现:

"./a.out: /lib64/libstdc++.so.6:version 'GLIBCXX_3.4.21' not found(required by ./a.out)",

所以接下来需要解决这个问题。

四、解决运行程序gcc出现'GLIBCXX_3.4.21' not found

这是因为升级gcc时,生成的动态库没有替换老版本gcc的动态库导致的,将gcc最新版本的动态库替换系统中老版本的动态库即可解决,运行以下命令检查动态库:

strings /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

从输出结果可以看到并没有“GLIBCXX_3.4.21“,所以可以断定我们的程序运行时动态加载的是老的动态库,解决这个问题需要将当前链接文件的链接指向改成最新的动态库地址:

cp /usr/local/lib64/libstdc++.so.6.0.21 /lib64
cd /lib64
rm -rf libstdc++.so.6
ln -s libstdc++.so.6.0.21 libstdc++.so.6

然后你可以执行以下命令来查看'GLIBCXX_3.4.21'已经可以找到了:

strings /lib64/libstdc++.so.6 | grep GLIBC

解决了这个问题终于可以执行程序了.

然后又测试了-g选项来编译程序,编译好程序调试程序时并不能够设置断点以及print变量的值,gdb调试中出现:Missing separate debuginfos, use: debuginfo-install glibc-2.17-106.e17_2.6.x86_4 libgcc-4.8.5-4.e17.x86_64的问题,通过上网查阅资料,是因为gcc版本和gdb版本并不匹配,或者说gdb版本过低,我的gdb版本是7.6.1,是2013年的,现在最新的是7.11.1,所以我决定直接升级到最新版本。

四、编译安装gdb-7.11.1

到官网http://ftp.gnu.org/gnu/gdb/直接下载最新的版本并进行编译安装:

tar -xvf gdb-7.11.1.tar.gz
cd gdb-7.11.1
./configure
make
make install

整个编译过程持续15分钟左右,当执行make install时gdb安装出现了错误:WARNING: 'makeinfo' is missing on your sysem,则需安装相关依赖程序:

yum install texinfo libncurses5-dev

依赖安装完成后重新执行make install就可以了,然后重新启动电脑:

init 6

重起后就可以通过gdb -v来查看gdb版本,现在已经是7.11.1了,但是当调试程序时出现下面信息时:

warning: File "/usr/local/lib64/libstdc++.so.6.0.21-gdb.py" auto-loading has been declined by your `auto-load safe-path' set to "$debugdir:$datadir/auto-load".
To enable execution of this file addadd-auto-load-safe-path /usr/local/lib64/libstdc++.so.6.0.21-gdb.py
line to your configuration file "/root/.gdbinit".
To completely disable this security protection addset auto-load safe-path /
line to your configuration file "/root/.gdbinit".

将以下信息放入 ~/.gdbinit 就可以了:

add-auto-load-safe-path /usr/local/lib64/libstdc++.so.6.0.21-gdb.py
set auto-load safe-path /

若想通过gdb来调试STL容器,则还需要做一些配置,可以通过GDB Python pretty printers来解决这个问题:

svn checkout svn://gcc.gnu.org/svn/gcc/trunk/libstdc++-v3/python stlPrettyPrinter
mv stlPrettyPrinter /usr/local

然后将下面的配置信息放入~/.gdbinit

python
import sys
sys.path.insert(0, '/usr/local/stlPrettyPrinter')
from libstdcxx.v6.printers import register_libstdcxx_printers
register_libstdcxx_printers (None)
end

更多有关GDB Python pretty printers的信息可以点击这里。

五、Cmake指定gcc版本

export CC=/usr/local/bin/gcc
export CXX=/usr/local/bin/g++

把这两个变量配置在 ~/.bash_profile  登录自动生效,这样不用每次修改 。

六、悬而未决的问题

gcc4.8.5 升级到gcc  5.2  isl' Makefile:663: *** missing separator.  Stop

CentOS 7升级gcc 8.3.1 7.x.x 4.9.4版本相关推荐

  1. CentOS yum升级GCC到4.8

    wget http://people.centos.org/tru/devtools-2/devtools-2.repo mv devtools-2.repo /etc/yum.repos.d yum ...

  2. Linux(CentOS)升级gcc到4.8.5版本

    本人使用的是CentOS 6.2 64位系统,由于在安装系统的时候并没有勾选安装gcc编译器,因此需要自行安装gcc编译器. 系统信息查看命令: cat /etc/redhat-release 使用y ...

  3. 【转】CentOS 6.6 升级GCC G++ (当前最新版本为v6.1.0) (完整)

    原文地址:https://www.cnblogs.com/lzpong/p/5755678.html 我这里是centos7 升级到gcc8.1,过程差不多,参考这篇文章,记录一下. ---原文--- ...

  4. 红帽linux 下qt 5.13.1 编译 mysql80驱动(内含升级gcc版本)

    前言: 本地一台redhat linux虚拟机已经安装了qt5.13.1以及mysql80 详细的安装流程可通过如下链接查看 linux 安装qt    安装mysql 在qt的数据库编程阶段,需要对 ...

  5. yum arm linux gcc 4.8,Linux-使用 yum 升级 gcc 到 4.8

    wget http://people.centos.org/tru/devtools-2/devtools-2.repo mv devtools-2.repo /etc/yum.repos.d yum ...

  6. centos 升级gcc

    //by yan 20200523 centos 升级gcc: centos7默认 gcc版本是4.8.5,编译不了redis6,需要升级 [root@VM_16_17_centos redis-6. ...

  7. linux6.7能升级6.8吗,CentOS 六、7升级gcc至4.八、4.九、5.二、6.三、7.3等高版本

    CentOS 7虽然已经出了不少年了,但依然会有不少人选择安装CentOS 6,CentOS 6有些依赖包和软件都比较老旧,现在天的主角gcc编译器,CentOS 6的gcc版本为4.4,CentOS ...

  8. 为CentOS 6、7升级gcc至4.8、4.9、5.2、6.3、7.3等高版本

    欢迎访问个人网站 首页_码到城攻码到城攻分享但不限于IT技术经验技巧.软硬资源.所闻所见所领会等,站点提供移动阅读.文章搜索.在线留言.支付打赏.个人中心.免签支付等功能https://www.cod ...

  9. 利用 scl 为 CentOS 升级 gcc 版本

    利用 scl 为 CentOS 升级 gcc 版本 (一)背景 在搞 dpvs 期间遇到的一个问题,在编译 dpdk 程序时会根据所在服务器的 cpu 所拥有的指令集,为了尽可能提高程序效率,将较新的 ...

最新文章

  1. Swift App项目总结
  2. Intellij IDEA 使用Spring-boot-devTools 没有生效 解决方法
  3. SQL SERVER-日期按时区转换
  4. Tomcat 配置 Context
  5. CSS+DIV-设置表格与表单
  6. 包装类转换基本数据类型与基本数据类型转换为包装类
  7. 南岸焊接机器人厂_严选原料,机器人焊接,探秘能达到奔驰标准的亿利生产线...
  8. Shell练习(十一)
  9. linux centos目录结构(二)
  10. 【每天学点管理学】目标管理工具——SMART法则
  11. HDFS中Locality 为什么介于0~1之间?与HBase之间有什么关系?
  12. 中国天网系统有多牛叉?BBC 记者体验了一把
  13. util是utiliy的缩写,意为多用途的,工具性质的包
  14. C++语言程序设计(郑莉)02 C++基本数据类型和表达式
  15. STM32cubeHAL ADC+TIM+DMA (二)
  16. java学习之面向对象和封装
  17. 2021年美亚杯资格赛解析
  18. Python spider (二) Requests Lxml bs4
  19. 工科生安装Ubuntu18.04后干的事情
  20. linear-gradiend ——实现网格背景效果

热门文章

  1. PAT 1052. 卖个萌 (20)
  2. 插入排序和冒泡排序算法JAVA实现
  3. windows 2008R2 无法安装操作系统补丁,或无法安装Sp1升级包的解决办法
  4. 关于ALTERA的FPGA的弱上拉问题
  5. EXT核心API详解(二)-Array/Date/Function/Number/String
  6. 如何通过使用注册项 (.reg) 文件添加、修改或删除注册表子项和值
  7. 牛客网(剑指offer) 第十三题 调整数组顺序使奇数位于偶数前面
  8. linux使用权限模式启动mongodb,Linux安装MongoDB启动及常见问题解决
  9. Swift之深入解析如何自定义操作符
  10. LeetCode 多线程 1114. 按序打印