操作系统版本是CentOS6.8,自带的GCC是4.4.7。因为需要编译C++11代码,所以升级编译器到gcc4.8.5版本。升级说明见《CentOS6.8升级gcc到4.8.5总结》。
    编译代码的时候是没有问题的,但是在运行的时候,却出现了libstdc++.so.6: version `GLIBCXX_3.4.14' not found的问题。经查询得知,这是C++库的版本和GCC版本不一致导致的。原先的是GCC4.4.7,自然和自带的C++库版本匹配的,因为升级了GCC所以才出现这个问题。
    解决办法就是对应升级一下C++库GLIBCXX到3.4.14版本。
    我们可以先看看现在系统安装有的库版本。输入如下命令:
strings /usr/lib/libstdc++.so.6 | grep GLIBCXX
    这个命令是查询libstdc++.so.6库文件里包含的GLIBCXX所有支持的版本列表,结果如下:
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_FORCE_NEW  
GLIBCXX_DEBUG_MESSAGE_LENGTH
    很显然,系统并没有3.4.14版本。
    下面开始升级新版本的GLIBCXX:

1.进入一个目录,下载GLIBCXX升级文件到当前目录
cd /tmp
wget http://ftp.de.debian.org/debian/pool/main/g/gcc-4.7/libstdc++6_4.7.2-5_i386.deb
2.解压
ar -x libstdc++6_4.7.2-5_i386.deb && tar xvf data.tar.gz
    后面的操作系统root权限,如果没有root权限,请使用sudo。解压后,我们需要的libstdc++.so.6文件就在当前目录的子目录/usr/lib/i380-linux-gun/下,切换进去
3.切换到这个目录后,输入dir命令,可以查看到这个目录有两个文件:libstdc++.so.6  libstdc++.so.6.0.17,不过我们只需要libstdc++.so.6.0.17。
cd /usr/lib/i380-linux-gun/
dir
4.复制文件到系统库目录下
cp libstdc++.so.6.0.17 /usr/lib

5.切换到/usr/lib来更新libstdc++.so.6。因为原先的这个库软链接的是低版本的GLIBCXX,所以才导致与现在的GCC不一致。也就是说,这个存在的libstdc++.so.6链接文件没有用了。我们要删掉它,然后重新创建一个新的链接文件libstdc++.so.6,并链接到我们下载的库文件。

cd /usr/lib/

rm -f libstdc++.so.6
ln libstdc++.so.6.0.17 libstdc++.so.6
6.这样就更新完毕。我们可以查看下现在的库版本列表,用:
strings /usr/lib/libstdc++.so.6 | grep GLIBCXX
    查看,如下所示:
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_DEBUG_MESSAGE_LENGTH

    显然,我们需要的3.4.14版本已经安装上了,而且还有其他更新的版本可以用。

    为了方便解决问题,我整理了一个一键更新GLIBCXX的脚本,供快速使用:


echo 查看已经安装的GLIBCXX版本,回车继续
strings /usr/lib/libstdc++.so.6 | grep GLIBCXX
echo 如果列表中没有你需要的版本,继续执行下面的更新过程(3.4.14-3.4.17),请以root用户权限执行。回车继续
read -n1
cd /tmp
wget http://ftp.de.debian.org/debian/pool/main/g/gcc-4.7/libstdc++6_4.7.2-5_i386.deb
ar -x libstdc++6_4.7.2-5_i386.deb && tar xvf data.tar.gz
cd /usr/lib/i380-linux-gun/
cp libstdc++.so.6.0.17 /usr/lib
cd /usr/lib/
rm -f libstdc++.so.6
ln libstdc++.so.6.0.17 libstdc++.so.6
echo 更新GLIBCXX完毕,下面显示最新的GLIBCXX版本列表,回车继续
read -n1
strings /usr/lib/libstdc++.so.6 | grep GLIBCXX
     如果最终的版本列表和文章的一致,就表示更新成功了。注意了,这个保存为脚本时,注意编码,否则在linux无法执行。保存为sh文件后,还有给sh文件增加x的权限,这样sh就可以执行了。