编译代码的时候是没有问题的,但是在运行的时候,却出现了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.6ln 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就可以执行了。