概述
最近在学习《深入应用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学习笔记的更多相关文章
-
Centos7升级gcc学习笔记 gcc 4.8.5 ->; gcc 5.4.0
摘自:https://www.cnblogs.com/highway-9/p/5628852.html 一.安装开发必备环境: yum groupinstall "Development T ...
-
Centos7升级gcc版本方法之一使用scl软件集
Centos7 gcc版本默认4.8.3,Red Hat 为了软件的稳定和版本支持,yum 上版本也是4.8.3,所以无法使用yum进行软件更新,所以使用scl. scl软件集(Software Co ...
-
Centos7升级gcc极简教程
centos7默认gcc版本为4.8,一般不满足编译需求,因此升级gcc版本为常见操作: 现有博客中,大多数教程都是基于源码重新编译安装:但是源码编译过程等待时间很长且编译麻烦. 因此,直接基于命令升 ...
-
CentOS7升级gcc
CentOS7.5升级gcc到8.3.0版本 1.下载源码包 cd /usr/local/src wget http://ftp.tsukuba.wide.ad.jp/software/gcc/rel ...
-
CentOS7 升级gcc版本
CentOS7自带的GCC版本是4.8.5,如下所示: # cat /etc/redhat-release CentOS Linux release 7.6.1810 (Core) # which g ...
-
gcc学习笔记
1:第一个程序 : hello world #include <stdio.h> int main(void) { printf("Hello , world ! \n" ...
-
【嵌入式开发】gcc 学习笔记(一) - 编译C程序 及 编译过程
一. C程序编译过程 编译过程简介 : C语言的源文件 编译成 可执行文件需要四个步骤, 预处理 (Preprocessing) 扩展宏, 编译 (compilation) 得到汇编语言, 汇编 (a ...
-
Centos7 升级 gcc
特别蛋疼的开始 最痛苦的就是一步一个坑 为了安装 vue.js,听说要安装 node.js,听说为了安装 node.js碰上了gcc版本不够的问题,此时我特别特别特别的想念盖茨大大 下载 gcc gc ...
-
centos7 升级GCC版本到7.3.0
废话不多说,直接上shell,还是比较简单的.就是编译时间有点长... 都是以小时计的......,我刀片机上面一台虚拟机反正是等了3个小时 #必备组件安装 yum install -y gcc gc ...
随机推荐
-
(转)解决Mac OS X上PhpStorm不能输入中文
看到Netbeans上类似问题的解决办法: /Applications/netbeans/NetBeans 6.7.1/Content/Resource/netbeans/etc/netbeans.c ...
-
iOS开发小技巧--实现毛玻璃效果的方法
一.美工出图 二.第三方框架 -- DRNRealTimeBlur,框架继承自UIView.使用方法:创建UIView直接继承自框架的View,就有了毛玻璃效果 三.CoreImage -- 图片加高 ...
-
设置TOMCAT的JVM虚拟机内存大小
你知道如何设置TOMCAT的JVM虚拟机内存大小吗,这里和大家分享一下,JAVA程序启动时JVM都会分配一个初始内存和最大内存给这个应用程序.这个初始内存和最大内存在一定程度都会影响程序的性能. 设置 ...
-
关于 swift 的图片多选问题
http://*.com/questions/20756899/how-to-select-multiple-images-from-uiimagepickercontroll ...
-
scala学习笔记:各种奇怪的写法
Unit函数的定义: def foo()={println("hi")} 等号可以省略: def foo(){println("hi")} update方法: ...
-
Office 2010 SP2简体中文正式版下载
此次发布的SP2包含最新的更新,提高安全性.性能和稳定性,此外SP2还是之前发布的所有更新.累积性更新的汇总.SP2还改善了Office 2010与IE10.Windows 8.Windows Ser ...
-
Android精品源码与技术博文
Android精品源码android遵循Material Design风格天气源码基于exoplay 自定义播放器 支持直播 1 ExoUserPlayer 基本播放器...几种动画效果Animati ...
-
201621123002《JAVA程序设计》第十四周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结与数据库相关内容. 2. 使用数据库技术改造你的系统 2.1 简述如何使用数据库技术改造你的系统.要建立什么表?截图你的表设计. 用 ...
-
Postgresql之VACUUM和VACUUM FULL对比
VACUUM命令存在两种形式,VACUUM和VACUUM FULL,它们之间的区别见如下表格: 无VACUUM VACUUM VACUUM FULL 删除大量数据之后 只是将删除数据的状态置为已删除, ...
-
Django 查询集简述
通过模型中的管理器构造一个查询集(QuerySet),来从数据库中获取对象.查询集表示从数据库中取出来的对象的集合.它可以含有零个.一个或者多个过滤器.过滤器基于所给的参数限制查询的结果. 从SQL ...