在学习或者编写C/C++程序的时候,可能由于编译器的版本较低,导致一些新增的知识点在加入到程序编译时,会出现一些问题,例如编译完成之后生成可执行文件,但你在执行可执行文件的时候,系统会报这样的错误:
[root@localhost ~]# ./a.out
./a.out: /usr/lib/libstdc++.so.6: version `GLIBCXX_3.4.14' not found (required by ./a.out)
这个原因是你升级了gcc的版本之后却没有用生成的动态库替换老版本的动态库, 这样在程序编译运行的时候偶尔就会遇到上面所述的问题,这个问题我们放到后面再进行解诀,下面就开始介绍gcc/g++编译器的升级过程:
首先升级gcc和g++是没有便捷方式的,例如像yum update .... yum install 这些命令都是没用的,或者添加yum的repo文件也是不行的,所以我们只能手动编译安装了,下面就开始我们的安装过程。
1、获取安装包并解压
wget http://ftp.gnu.org/gnu/gcc/gcc-6.1.0/gcc-6.1.0.tar.bz2
tar -jxvf gcc-6.1.0.tar.bz2当然,http://ftp.gnu.org/gnu/gcc 里面有所有的gcc版本可供下载,最新的版本已经更新到7.1.0,但是我们并不需要最新版本,下面就用6.1.0版本来操作,其他的版本都可类似操作。
2、下载供编译需求的依赖项
这个神奇的脚本文件会帮我们下载、配置、安装依赖库,可以节约我们大量的时间和精力。
cd gcc-6.1.0
./contrib/download_prerequisites
运行这个脚本要在联网状态下完成,因为要下载配置,安装依赖库,这也需要时间,网络不好的时候会是一个较慢长的等待时间。
3、建立一个目录供编译出的文件存放
mkdir gcc-build-6.1.0
cd gcc-build-6.1.0
4、生成Makefile文件
../configure -enable-checking=release -enable-languages=c,c++ -disable-multilib
5、编译
make -j4
-j4选项是make对多核处理器的优化,如果不成功请使用make
(注意:此步骤非常耗时,我虚拟机耗时近3小时; 实体机近80分钟,CPU基本是满的,内存也使用不少)
6、安装
make install(安装需要root权限)
查看安装
ls /usr/local/bin | grep gcc
7、重启然后查看gcc版本
gcc -v
8、这之后你就可以写个C++11的程序段进行测试
代码在此处省略。。。。。。
g++ -std=c++0x -o demoCpp11 demoCpp11.cpp
通过上面的步骤就可以完成对g++和gcc的升级
下面我们来解决开头提到的问题:
源码编译升级安装了gcc后,编译程序或运行其它程序时,有时会出现类似/usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.14' not found的问题。这是因为升级gcc时,生成的动态库没有替换老版本gcc的动态库导致的,将gcc最新版本的动态库替换系统中老版本的动态库即可解决。
(1). 运行以下命令检查动态库:
strings /usr/lib64/libstdc++.so.6 | grep GLIBC
从输出可以看出,gcc的动态库还是旧版本的。说明出现这些问题,是因为升级gcc时,生成的动态库没有替换老版本gcc的动态库。
(2). 执行以下命令,查找编译gcc时生成的最新动态库:
find / -name "libstdc++.so*"
将上面的最新动态库libstdc++.so.6.0.22复制到/usr/lib64目录下
cd /usr/lib64
cp /root/Downloads/gcc-6.1.0/gcc-build-6.1.0/stage1-x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.22 ./
(3). 删除原来软连接:
rm -rf libstdc++.so.6
(4). 将默认库的软连接指向最新动态库:
ln -s libstdc++.so.6.0.22 libstdc++.so.6
(5). 默认动态库升级完成。重新运行以下命令检查动态库:
strings /usr/lib64/libstdc++.so.6 | grep GLIBC
可以看到 输出有"GLIBCXX_3.4.14" 了
注意:网上的有一些教程在解决这个问题的时候会有这种方法,就是在网上找一个 libstdc++.so.6.0.22,然后使用这个来生成软连接,这样是不行的,一定要用自己编译的动态库,否则当你重启电脑的时候,你的CentOS桌面系统就会出问题,图形化界面都无法操作,就是因为你使用了一个来路不明的动态库导致的,解决办法就是使用自己编译的动态库或者系统自带的动态库来生成软连接,这样重启之后系统就会恢复了。