Как исправить сломанный libstdc++6, который также ломает apt

Как исправить сломанный libstdc++6, который также ломает apt

Кажется, я что-то напутал с ручным 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

Сначала мне удалось получить графическую оболочку входа, вручную скопировавlibstdc++.so.6.0.21на его место с Live USB-накопителя и создания ссылки на него из libstdc++.so.6. Я использовал именно эту версию, поскольку она, похоже, является версией по умолчанию для Ubuntu 16.04 и также содержит «21», упомянутую в сообщении об ошибке («версия GLIBCXX_3.4.21»).

Хотя это, казалось, удовлетворило графический стек, те же ошибки остались aptи с другими программами, зависящими от libstdc++6. После некоторых попыток я смог решить все это с помощью следующих шагов, используя dpkgдля ручной (де)установки вещей:

  • Загрузите deb-файлы в нужных версиях для 16.04:

    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
    

Связанный контент