以前对软件包的构建不太了解,喜欢随意修改软件源列表,软件源和当前系统的版本不一致就会出现安装了一个依赖较多的软件包后会出现连锁反应,修改了所有依赖的软件包版本,导致系统故障。最常出现的就是修改了GCC版本,导致GLIBCXX版本不一致,导致系统软件无法运行。

如果你的系统还能正常安装软件,那么修改软件源和当前系统版本保存一致,然后更新软件,并重新安装GCC即可解决问题。具体步骤如下:

# 修改软件源
sudo vim /etc/apt/sources.list
# 检查当前系统版本
lsb_release -a
# 将软件源修改为当前系统版本的软件源,Ubuntu系统版本号对应的软件源列表可以在https://wiki.ubuntu.com/Releases查看
# 更新软件
sudo apt update
# 安装GCC,build-essential包含了GCC
sudo apt install build-essential

如果你和我一样倒霉,连 apt 都无法使用,那么可以使用 dpkg 命令手动安装 GCC。

因为误操作在 Ubuntu 20.04 上安装了 Ubuntu 18.04 的 GCC,导致系统软件无法运行,apt 也无法使用,所以只能手动安装 GCC。

apt: libx86_64-linux-gnu-libstdc++.so.6: version `GLIBCXX_3.4.29' not found (required by libx86_64-linux-gnulibapt-private.so.0.0)

既然libstdc++版本不一致,我们就去下载对应版本的GCC,访问https://packages.ubuntu.com/,在下方的搜索框中输入libstdc++6,选择对应的系统版本,然后下载对应的GCC。

Responsive Image

点击搜索结果,点击系统的架构,一般为amd64,

Responsive Image

具体下载地址比较隐蔽,直接点击红框的链接没有反应,你可以右键另存为到本地,我习惯复制链接后用wget下载。

Responsive Image

下载完成后,使用dpkg命令安装GCC。

sudo dpkg -i libstdc++6_12.3.0-1ubuntu1\~22.04_amd64.deb

之后可以检查一下缺失的GLIBCXX版本已经安装。

$ strings /lib/x86_64-linux-gnu/libstdc++.so.6 | grep GLIBCXX                               
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
GLIBCXX_3.4.22
GLIBCXX_3.4.23
GLIBCXX_3.4.24
GLIBCXX_3.4.25
GLIBCXX_3.4.26
GLIBCXX_3.4.27
GLIBCXX_3.4.28
GLIBCXX_3.4.29
GLIBCXX_3.4.30
GLIBCXX_DEBUG_MESSAGE_LENGTH

此时apt 应该就可以正常使用了,我们只需要修复一下所有软件包,让它回到正确的版本即可恢复系统。

sudo apt --fix-broken install