gcc
我似乎在过去的某个时候手动更新时搞砸了一些东西,直到今天我从 14.04 升级到 16.04 时才出现问题。也就是说,系统似乎认为libstdc++6
版本没问题,而apt
(和许多其他程序)却抱怨它不行(因为共享库实际上是错误的版本):
sudo apt-get install --fix-broken --fix-missing
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
系统甚至没有启动图形模式,上述输出是使用非图形控制台(使用Ctrl-Alt-F6
)获得的,并且apt
本身完全无法使用,所以我不能只是做重新安装之类的事情。
当我用于管理这些包的程序本身受到影响并且无法使用时,我该如何修复并重新安装这些包?
答案1
起初,我可以通过手动复制来获得图形登录 shelllibstdc++.so.6.0.21
从 Live USB 驱动器放入其位置,并从 创建一个指向它的链接libstdc++.so.6
。我使用这个版本,因为它似乎是 Ubuntu 16.04 的默认版本,并且还包含错误消息中提到的“21”(“版本 GLIBCXX_3.4.21”)。
虽然这似乎满足了图形堆栈的要求,apt
但其他依赖 libstdc++6 的程序仍然存在同样的错误。经过几次尝试,我可以使用以下步骤解决整个问题,并dpkg
手动(卸载)安装一些东西:
下载适合 16.04 的正确版本的 deb 文件:
wget http://mirrors.kernel.org/ubuntu/pool/main/a/apt/apt_1.2.10ubuntu1_amd64.deb http://mirrors.kernel.org/ubuntu/pool/main/g/gcc-5/libstdc++6_5.4.0-6ubuntu1~16.04.4_amd64.deb
删除此特定版本,阻止安装正确的 libstdc++6:
sudo dpkg --force-depends -r libstdc++6:i386
然后从文件中安装“好”的版本:
sudo dpkg -i libstdc++6_5.4.0-6ubuntu1~16.04.4_amd64.deb apt_1.2.10ubuntu1_amd64.deb
最后,修复我在更新和尝试时留下的混乱:
sudo apt-get install -f