概述

最近在学习《深入应用C++11-代码与优化与工程级应用》,我的gcc版本是gcc-4.8.5是支持C++11的,但是我在作者的github上看了一些C++例子,其中有些是C++14的语法,我的gcc版本并不支持,之前安装了ubuntu16.04LTS,该系统的gcc版本是5.3.1这个是支持C++14的,所以我打算用ubuntu16.04LTS来作为开发系统算了,但后来又想折腾一些自己没有做过的事情可以作为经验积累,所以我又放弃了使用现成的ubuntu16.04LTS,经过三晚的折腾终于将Centos的gcc升级到了5.4.0,现在最新的gcc版本是6.1.0,本来打算直接升级到6.1.0的,但是在升级过程中遇到了一些问题,主要是两个gcc版本跨度过大,不能够一步升级成功,所以我决定升级到5.4.0,我现在将编译安装gcc的步骤以及踩的坑记录了下来。

一、安装开发必备环境:

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

二、编译安装gcc-5.4.0

你可以到官网下载gcc,也可以直接在这里下载:http://ftp.tsukuba.wide.ad.jp/software/gcc/releases/ 下载好后进行编译安装:

tar -xvf gcc-5.4.0.tar.bz2
cd gcc-5.4.0
./contrib/download_prerequisits
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/gcc-5.4.0下,编译过程十分漫长,我的笔记本用了两三个小时,公司的电脑只用了一个小时,编译安在完成后需要重启电脑:

init 6

重起后就可以通过gcc -v来查看gcc版本,现在已经是5.4.0了,所以我决定写一个小程序来测试一下,编译程序没有问题,但是运行的时候出现"./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 add
add-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 add
set 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的信息可以点击这里

五、总结

折腾一些我们没有接触过的东西将学习到很多新的知识或经验。

Centos7升级gcc学习笔记的更多相关文章

  1. Centos7升级gcc学习笔记 gcc 4.8.5 -> gcc 5.4.0

    摘自:https://www.cnblogs.com/highway-9/p/5628852.html 一.安装开发必备环境: yum groupinstall "Development T ...

  2. Centos7升级gcc版本方法之一使用scl软件集

    Centos7 gcc版本默认4.8.3,Red Hat 为了软件的稳定和版本支持,yum 上版本也是4.8.3,所以无法使用yum进行软件更新,所以使用scl. scl软件集(Software Co ...

  3. Centos7升级gcc极简教程

    centos7默认gcc版本为4.8,一般不满足编译需求,因此升级gcc版本为常见操作: 现有博客中,大多数教程都是基于源码重新编译安装:但是源码编译过程等待时间很长且编译麻烦. 因此,直接基于命令升 ...

  4. CentOS7升级gcc

    CentOS7.5升级gcc到8.3.0版本 1.下载源码包 cd /usr/local/src wget http://ftp.tsukuba.wide.ad.jp/software/gcc/rel ...

  5. CentOS7 升级gcc版本

    CentOS7自带的GCC版本是4.8.5,如下所示: # cat /etc/redhat-release CentOS Linux release 7.6.1810 (Core) # which g ...

  6. gcc学习笔记

    1:第一个程序 : hello world #include <stdio.h> int main(void) { printf("Hello , world ! \n" ...

  7. 【嵌入式开发】gcc 学习笔记(一) - 编译C程序 及 编译过程

    一. C程序编译过程 编译过程简介 : C语言的源文件 编译成 可执行文件需要四个步骤, 预处理 (Preprocessing) 扩展宏, 编译 (compilation) 得到汇编语言, 汇编 (a ...

  8. Centos7 升级 gcc

    特别蛋疼的开始 最痛苦的就是一步一个坑 为了安装 vue.js,听说要安装 node.js,听说为了安装 node.js碰上了gcc版本不够的问题,此时我特别特别特别的想念盖茨大大 下载 gcc gc ...

  9. centos7 升级GCC版本到7.3.0

    废话不多说,直接上shell,还是比较简单的.就是编译时间有点长... 都是以小时计的......,我刀片机上面一台虚拟机反正是等了3个小时 #必备组件安装 yum install -y gcc gc ...

随机推荐

  1. 在适配iPhone 6 Plus屏幕的时候,模拟器上两边有很细的白边如何解决

    取消掉Constrain to margin 然后添加左右约束 版权声明:本文为博主原创文章,未经博主允许不得转载.    

  2. 第三百三十八天 how can I 坚持

    下午去奥体森林公园跑了个步,好累. 晚上和徐斌同学一起吃了个饭,接触了下杨辉三角,还没整明白,明天看下. 突然想起java 编译,ant脚本. 要精通门技术,还要赶上潮流. 睡觉.

  3. vim插件开发初步

    [vim插件开发初步] 将如下代码存在helloworld.vim, 放在~/.vim/plugin目录下,插件即可生效.:w保存代码后, 用:source命令执行后,也可以使用Helloworld命 ...

  4. 用keyword实现Editor.GetSelection的退出功能

    有时候我们在使用 GetSelection 功能让用户选择实体时,可能会给用户提供一些 keyword 选项,要接收用户选择的 keyword 选项,需要用到 PromptSelectionOptio ...

  5. Keil MDK Code、RO-data、RW-data、ZI-data数据段

      Program Size: Code=10848 RO-data=780 RW-data=372 ZI-data=868   Code 表示程序代码指令部分 存放在Flash区 RO-data 表 ...

  6. redis的发布订阅模式

    概要 redis的每个server实例都维护着一个保存服务器状态的redisServer结构 struct redisServer {     /* Pubsub */     // 字典,键为频道, ...

  7. Form时间交叉验证唯一性

    *==================================================   ** PROCEDURE:   check_effcitive_utl      Descr ...

  8. CorelDraw x6【Cdr x6】官方简体中文破解版(64位)安装图文教程、破解注册方法

    国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...

  9. Spket在Eclipse/MyEclipse下的安装和配置(图文教程)

    一.安装Spket 第一种方法:网上更新方式 1.插件首页:http://www.spket.com2.插件名称:Spket IDE3.更新连接(Update Site):http://www.spk ...

  10. CMSIS RTOS -- embOS segger

    #ifndef __CMSIS_OS_H__ #define __CMSIS_OS_H__ #include <stdint.h> #include <stddef.h> #i ...