
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