apt: 重定位错误: 版本GLIBCXX_3.4.21在文件libstdc++.so.6中未定义,具有链接时间引用。

自从尝试升级到16.04版本的xenial以后,我一直遇到这个问题。
$ apt
apt: 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

当简单运行apt时。不用说这使得做任何事情都变得困难。
有什么提示吗?

哇...这让我真的对Ubuntu/Canonical的升级过程产生了怀疑。每次我有一个可用但是陈旧的版本时,论坛上总有人告诉我升级会解决所有问题...我不知道什么是"scratch disk",当然也不想在工作中被GRUB调试打断... - isomorphismes
13个回答

我遇到了同样的问题,是由于 Ubuntu 工具链中的 PPA 引起的。我的电脑因此无法启动。在 @w00kie 在他的回答中提到的评论后,我从 tty 终端下载了包含链接 https://packages.ubuntu.com/xenial/libstdc++6Xenial 版本的 libstdc++6 debian 包,并使用 dpkg -i 安装。现在电脑正常工作了。

步骤

wget http://security.ubuntu.com/ubuntu/pool/main/g/gcc-5/libstdc++6_5.4.0-6ubuntu1~16.04.10_amd64.deb
sudo dpkg -i libstdc++6_5.4.0-6ubuntu1~16.04.10_amd64.deb

# I also found this helpful
sudo apt-get -f install

5请你能否在回答中逐步列出命令?我对这一点完全不熟悉,而且我的Linux机器出了问题。 - Zachary Fields
@Zachary 你面临的确切问题是什么?你能够启动吗? - Sagar Jha
1不是真的。如果我放手,屏幕会闪烁大约15分钟,然后我会得到一个非常浅灰色的tty2终端提示符。我无法使用apt(或任何工具)。我甚至尝试从可启动的USB驱动器上下载libstdc++6...deb,手动放置该软件包,重新启动进入损坏的系统,并使用sudo dpkg -i libstdc++6...deb安装.deb,但它甚至不知道dpkg是什么。 - Zachary Fields
这是非常不太可能的。dpkg 应该是存在的。请查看这个链接:http://askubuntu.com/questions/452615/told-command-dpkg-cannot-be-found - Sagar Jha
我很感激你的统计分析,但是在启动时没有dpkg。然而,mvcp都是可用的,所以我把我想要保留的东西移动到一个从可启动的USB媒体中可见的文件夹中,将文件复制到一个闪存驱动器上,并对机器进行了一次全新安装16.04的刷新。一切都很好。 - Zachary Fields
请问您能告诉我如何使用终端自身下载并安装吗?我遇到了闪烁和apt命令的相同问题,但dpkg命令可以正常工作。 - Ankit Agarwal
要安装.deb文件,请在终端上运行以下命令:wget http://security.ubuntu.com/ubuntu/pool/main/g/gcc-5/libstdc++6_5.3.1-14ubuntu2.1_amd64.deb。该链接适用于64位的Ubuntu。如果您使用32位系统,请将链接中的amd64替换为i386。如果可能的话,您也可以在浏览器中打开该链接。 - Sagar Jha
13要下载/安装.deb文件,您可以执行以下操作:wget http://security.ubuntu.com/ubuntu/pool/main/g/gcc-5/libstdc++6_5.4.0-6ubuntu1~16.04.2_amd64.deb,然后一旦下载完成,运行dpkg -i libstdc++6_5.4.0-6ubuntu1~16.04.2_amd64.deb(假设是64位系统)。对于我来说,我的互联网连接不起作用,所以我从另一台计算机上将其下载到了USB驱动器上,然后必须手动在有问题的计算机上挂载USB驱动器(sudo mount /dev/sdc1 /media/usb,其中sdc1是在插入USB后通过观察终端输出找到的),然后运行上述的dpkg命令。 - Garrett
谢谢,我在从14.04升级后一直卡在闪屏界面,直到我看到了这篇帖子。 - Jared Chu
这也解决了我的问题。我的系统(Debian笔记本电脑)的硬盘出现故障。我能够将大部分硬盘数据使用ddrescue工具复制到一个新的固态硬盘上。然后系统能够启动,但无法启动X,出现了libvirt错误。我尝试重新安装libvirt,但遇到了一个与原帖类似的错误,最终导致我来到这里。手动安装适用于我的发行版的.deb文件解决了问题(尽管还需要重新安装一些其他程序)。 - user1794469
8我不得不使用 dpkg --force-all -i libstdc+‌​+6_5.4.0-6ubuntu1~16‌​.04.2_amd64.deb 来进行安装。 - virtualxtc
我需要将--auto-deconfigure作为dpkg -i的额外参数。 - isomorphismes
那个文件似乎消失了... - jjmerelo
我正在运行在 armhf 架构上,提供的链接没有相应的下载选项。你有什么建议吗? - dotconnor
我不得不安装几个额外的软件包来解决这个问题,请参考https://askubuntu.com/a/1437932/1179344。 - ferdymercury

罪魁祸首是来自Ubuntu工具链上传(受限)的PPA的剩余文件。
/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.22

有两种处理这个问题的可能性:
  • 你已经安装了 ppa-purge。然后运行

    sudo ppa-purge ppa:ubuntu-toolchain-r/test
    

    来解决问题。

  • 通过下载libstdc++6 for Xenial并使用dpkg -i进行安装,覆盖 libstc++。


4至少对我来说,这个失败的消息与问题中的消息完全相同... - mbdevpl
1应该从下面的答案中扩展,因为显然ppa-purge不起作用(同样是Python)。 - user64204
1我得到的错误信息是:sudo: ppa-purge: 命令未找到 - Garrett
@Garrett sudo apt安装ppa-purge - Nico Schlömer
3@NicoSchlömer,谢谢,但实际上,我相信我的apt也没有工作(根据原始帖子)。 - Garrett
在我清理完之后,每次使用apt安装另一个软件包时,这个问题都会再次出现。看起来是libc-bin软件包中的某个维护脚本盲目地将libstdc++.so.6链接更新为指向libstdc++.so.6.0.22。删除/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.22解决了这个问题。 - nmgeek
我不得不使用第二种解决方案,使用wget或curl单独下载libstdc++6 .deb文件,然后对.deb文件运行dpkg -i --auto-deconfigure命令。 - BjornW

我的电脑因为这个错误无法正确启动。apt-get和Gnome都无法工作。这是在从14.04升级到16.04后立即发生的。我通过在tty中输入以下命令解决了这个问题。
sudo apt-add-repository --remove ppa:ubuntu-toolchain-r/test

此时 apt-get 开始恢复工作,我能够从那里解决所有问题。
sudo apt-get clean
sudo apt-get update
sudo apt-get install -f
sudo dpkg -a --configure
sudo apt-get dist-upgrade

我在执行更新命令后不得不卸载Virtualbox,并稍后重新安装,但我认为这与此无关。

3我尝试了这个,但在apt_pkg包上遇到了导入错误。 - Mixone
Mixone,具体是什么错误?是在哪个命令上出现的? - Matjaz
sudo apt-get update 出错了,我猜是由于 Python 后端引起的,堆栈跟踪显示是 Python 错误,基本上说找不到 apt_pkg 模块。 - Mixone
5我也遇到了同样的问题,尝试在你的回答中使用apt-add-repository命令时出现了以下错误:ImportError: /usr/lib/x86_64-linux-gnu/libapt-pkg.so.5.0: symbol _ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE7compareERKS4_, version GLIBCXX_3.4.21 not defined in the file libstdc++.so.6 with link time reference - Garrett
对于像我这样的白痴,两年后才尝试升级并认为所有错误都已修复。上面的链接已经失效,请使用以下新链接:http://security.ubuntu.com/ubuntu/pool/main/g/gcc-5/libstdc++6_5.4.0-6ubuntu1~16.04.10_amd64.deb(或 i386 或两者兼有)不要在意 dpkg 对你的咒骂。执行 --auto-deconfigure 命令,即使出现错误信息,你的 apt-get 也会重新回到正轨。然后你就可以通过正确的 -f --install + --upgrade 完成升级,并重启进入一个全新的系统。 - Ufos

我曾经认为这个问题是我独特的,是由下载错误引起的。

这次讨论给了我所需要的线索。基本上,所需的只是用 libstdc++.so.6.0.21 替换 /usr/lib/x86_64-linux-gnu 中失败系统中的 libstdc++.so.6.0.22。(似乎新版本中有一个错误。)

可以通过闪存驱动器完成此操作,或者像我一样,使用临时磁盘。

完整详情请参考:https://answers.launchpad.net/ubuntu/+question/395832

感谢大家...


我使用了这个技巧,在一些空闲空间上进行了双系统启动。我能够轻松地挂载原始分区。这很容易。 - Andrew
太棒了 - 这三个命令对我起作用了:cd /usr/lib/x86_64-linux-gnu/ >>> sudo rm libstdc++.so.6 >>> sudo ln -s libstdc++.so.6.0.21 libstdc++.so.6 - osman

根据接受的答案中的dpkg -i方法,我的14.04->16.04升级需要两个包,而不仅仅是一个。
gcc-5-base_5.4.0-6ubuntu1~16.04.4_i386.deb
libstdc++6_5.4.0-6ubuntu1~16.04.4_i386.deb

在此之后,apt upgrade能够下载剩余的软件包并完成安装。

如果您在Yakkety上使用Snappy安装了最新版本的'conjure-up'快照,那么您的apt将会出现一个非常相似的错误,并且无法正常工作。
apt: relocation error: /usr/lib/x86_64-linux-gnu/libapt-private.so.0.0: symbol _ZN13pkgSourceList16AddVolatileFilesER11CommandLinePSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS8_EE, version APTPKG_5.0 not defined in file libapt-pkg.so.5.0 with link time reference

由于这个错误:

https://bugs.launchpad.net/snappy/+bug/1a677417

目前我所知道的唯一解决办法是删除conjure-up snap(或者可能将其“snap revert”到以前的版本,如果你之前安装过的话)。

  1. 从Ubuntu软件包管理器网站上下载适用于您的Ubuntu版本的libstdc++6。 (使用uname -a命令查找硬件和软件架构)。

  2. 运行以下命令:

    sudo dpkg --install --auto-deconfigure libstdc++6...deb
    
  3. 重新启动。Ubuntu应该能够启动,但apt无法安装新的软件包。

  4. 为了修复依赖关系并使系统保持最新状态,请运行以下命令:

    sudo apt-add-repository ppa:ubuntu-toolchain-r/test
    sudo apt-get update
    sudo apt-get install -f
    sudo apt-get upgrade
    sudo apt-get dist-upgrade
    sudo apt-get autoclean && sudo apt-get autoremove  
    

我找到的解决方法是将Ubuntu工具链ppa重新添加进去。
sudo apt-add-repository ppa:ubuntu-toolchain-r/test
sudo apt-get update
sudo apt-get install -f
sudo apt-get upgrade

在i386系统中可能会出现非常相似的问题。

为了解决这个问题,我还不得不将gcc-5-base从版本5.4.1-2ubuntu1~12.04降级到5.4.0-6ubuntu1~16.04.4

为了完成对一个看起来合理的系统的升级,我还不得不使用dpkg --purge on vituoso_nepomuk和virtualbox来摆脱它们的配置文件,这些文件给我带来了麻烦(对我来说,VirtualBox由virtualbox-5.1软件包提供,似乎没有受到升级的影响)。

关键是让dpkg --configure dbus正常工作。

在tty类型的屏幕中启用wget,用户可能还需要执行sudo dhclient eth0以启用有线以太网连接。


你应该能够通过输入以下命令来修复它:
sudo apt-get -f install
不需要指定任何软件包。这样应该可以解决问题。