程序猿因新项目要做,服务器ubuntu系统从12.04升级到14.04再升级16.04,gcc、
环境配置等升级,程序猿在服务器上瞎搞。输入apt-get 升级时出了这个情况:
apt-get: relocation error: /usr/lib/x86_64-linux-gnu/libapt-pkg.so.5.0: symbol _ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE7compareERKS4_, version GLIBCXX_3.4.21 not defined in file libstdc++.so.6 with link time reference
谷歌了一下这个错误:版本GLIBCXX_3.4.21在文件libstdc ++.so.6中未定义。文件位置为: /usr/lib/x86_64-linux-gnu/
程序猿说找了网上的教程,都没有解决。然后甩锅给我。。。我也不会呀!!!硬着头皮上
查找编译gcc时生成的最新动态库:
find / -name libstdc++.so*
发现在不同的文件夹下有libstdc++.so.6.0.21,libstdc++.so.6.0.22文件。分别拷贝到 /usr/lib/x86_64-linux-gnu/目录下
***************************************************
现在重建默认库的软连接。(为啥拷贝上面两个文件,系统给程序猿弄乱了,libstdc++.so.6.0.22是能找到的最高版本,不知道哪个文件能用,只好从高版本慢慢降低版本来搞事情了)
切换工作目录:
cd /usr/lib/x86_64-linux-gnu/
删除原来软连接:
rm -rf libstdc++.so.6
将默认库的软连接指向最新动态库libstdc++.so.6.0.22试试:
ln -s libstdc++.so.6.0.22 libstdc++.so.6
结果:运行apt 依旧报错。
删除libstdc++.so.6.0.22建立的软连接:
rm -rf libstdc++.so.6
将默认库的软连接指向最新动态库libstdc++.so.6.0.21再试试:
ln -s libstdc++.so.6.0.21 libstdc++.so.6
结果:运行apt 成功。
strings /usr/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 GLIBCXX_3.4.20 GLIBCXX_3.4.21 GLIBC_2.4 GLIBC_2.17 GLIBCXX_DEBUG_MESSAGE_LENGTH |
***************************************************************
不清楚 libstdc++.so.6.0.21是不是和GLIBCXX_3.4.21是一对关联文件,尾数都是*.21。