概述

最近在学习《深入应用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. Flex SDK包内文件夹内容说明

    打开SDK目录,让我们看看SDK中都包含了哪些内容: ant包含Flex对Ant的支持库,JAR和Java源码都有,方便我们基于Ant完成对项目的构建 asdoc基于ASDOC我们可以很方便的生成代码 ...

  2. UVALive 3959 Rectangular Polygons (排序贪心)

    Rectangular Polygons 题目链接: http://acm.hust.edu.cn/vjudge/contest/129733#problem/G Description In thi ...

  3. c语言指针详解(转载)

    转自(http://blog.csdn.net/ad_ad_ad/article/details/1522145) 指针是C语言中广泛使用的一种数据类型. 运用指针编程是C语言最主要的风格之一.利用指 ...

  4. 【全面完美方案】iPhone 4S WiFi变灰 DIY修复方式

    这是我在一位台湾网友usaretama发表的一篇帖子中看到的,原帖我发表在维维网 如果你有WiFi开关变灰不能切换.WiFi遇到搜不到AP或搜到了连不上,那您就要注意这篇了. 家人的 iPhone 4 ...

  5. OC:继承、初始化方法、便利构造器

    A继承 的作用就是为了,节省代码.     继承 :子类会继承父类 里面所有的内容     思想 :凡是继承过来的实例变量和方法 都是自己的(是从父类遗传过来的)     继承的使用场景 : 当我们多 ...

  6. NAND flash NOR flash SDRAM区别

    nand flash:适合大容量数据存储,类似硬盘:nor flash:适合小容量的程序或数据存储,类似小硬盘:sdram:主要用于程序执行时的程序存储.执行或计算,类似内存. 区别:nor flas ...

  7. SQL函数集合

    1. PATINDEX ( '%pattern%' , expression ) 返回pattern字符串在表达式expression里第一次出现的位置,起始值从1开始算. pattern字符串在ex ...

  8. vs2012 + web api + OData + EF + MYsql 开发及部署

    先说下我的情况,b/s开发这块已经很久没有搞了,什么web api .MVC.OData都只是听过,没有实际开发过,因为最近要开发一个手机app的服务端,所以准备用这套框架来开发. 下面开始进入正题( ...

  9. 更改SQL数据库的繁体数据为简体

    上一篇说到,公司需要把所有的系统逐步更改为简体,一些系统可以保持原先的繁体数据,而有一些系统应使用部门的要求,必须要更改为简体,由于程序很大,报表也多,修改程序转换显示的可能性不大,故所以打算把数据库 ...

  10. IAR USING PRE- AND POST-BUILD ACTIONS

    Using pre-build actions for time stamping If necessary, you can specify pre-build and post-build act ...