最近在学习《深刻应用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的步骤以及踩的坑记录了下来。python
yum groupinstall "Development Tools" yum install glibc-static libstdc++-static
你能够到官网下载gcc,也能够直接在这里下载:http://ftp.tsukuba.wide.ad.jp/software/gcc/releases/ 下载好后进行编译安装:c++
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编译时须要:git
因为网络条件不是很好,在下载这几个文件时好久都下载不下来,因此我中断了不少次,并删除下载了的文件,从新执行./contrib/download_prerequisits
命令,下载完成后在configure时配置一些选项,我没有使用--prefix,在make install
时将自动安装到/usr/local/gcc-5.4.0
下,编译过程十分漫长,个人笔记本用了两三个小时,公司的电脑只用了一个小时,编译安在完成后须要重启电脑:github
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)",因此接下来须要解决这个问题。ubuntu
这是由于升级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'已经能够找到了:ide
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,因此我决定直接升级到最新版本。svn
到官网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
的信息能够点击这里。
折腾一些咱们没有接触过的东西将学习到不少新的知识或经验。