装了gcc-12或gcc-13后gcc --version仍显示旧版本,是因为Ubuntu通过update-alternatives管理软链接接力而非包名决定默认编译器;需用sudo update-alternatives --install注册新版本并--config手动切换,否则即使安装成功也不会接管gcc命令。

装了 gcc-12 或 gcc-13 后 gcc --version 仍显示旧版本,不是没装上,而是系统没把新版本设为默认——Ubuntu 不靠“装了哪个包”决定用谁,而是靠 update-alternatives 管理软链接接力。
确认当前 gcc 实际指向哪一版二进制
别信 gcc --version,先看它到底是谁:
-
which gcc查命令在 PATH 中的首个位置(通常是/usr/bin/gcc) -
readlink -f $(which gcc)沿软链接一路追到底,输出类似/usr/bin/gcc-11或/usr/bin/gcc-13 -
ls -l /usr/bin/gcc应该显示指向/etc/alternatives/gcc,再ls -l /etc/alternatives/gcc才是最终目标
如果最终指向的是 gcc-11,哪怕你已 sudo apt install gcc-13,它也不会自动接管 gcc 这个名字。
用 update-alternatives 注册并切换 GCC 版本
Ubuntu 官方包安装的 gcc-13 通常不会自动注册进 alternatives,得手动加:
- 先注册:
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-13 13 --slave /usr/bin/g++ g++ /usr/bin/g++-13 - 再配置选择:
sudo update-alternatives --config gcc,终端会列出所有已注册版本,输入对应编号回车即可 - 验证:
gcc --version和g++ --version应同步更新;gcc -dumpmachine可确认目标平台未变(仍是x86_64-linux-gnu)
注意:数字 13 是优先级(越高越可能被 auto 模式选中),不是版本号;若同时注册了 gcc-12 和 gcc-13,建议给后者设更高优先级(如 20)。
从 PPA 安装更新的 GCC 版本(如 GCC 14)
Ubuntu 官方源一般滞后 1–2 个主版本,要 GCC 14 得用 ubuntu-toolchain-r/test PPA:
- 添加源:
sudo add-apt-repository ppa:ubuntu-toolchain-r/test - 更新并安装:
sudo apt update && sudo apt install gcc-14 g++-14 - 注册进 alternatives(同上):
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-14 20 --slave /usr/bin/g++ g++ /usr/bin/g++-14
PPA 包命名严格遵循 gcc-XX 格式,不会出现 gcc-14.0 这类带小数点的包名;装完后务必检查 /usr/bin/gcc-14 是否真实存在,否则 update-alternatives 会注册失败且无提示。
交叉编译器(如 aarch64-linux-gnu-gcc)不走 alternatives
这类工具链由 gcc-aarch64-linux-gnu 等独立包提供,它们不参与 gcc 的默认切换逻辑:
- 安装后命令名固定为
aarch64-linux-gnu-gcc,不会覆盖或影响主机gcc - 不通过
update-alternatives管理,也不响应--config gcc - CMake 中必须显式指定:
-DCMAKE_C_COMPILER=aarch64-linux-gnu-gcc,不能只设CMAKE_SYSTEM_PROCESSOR
最容易忽略的一点:交叉编译器的 libstdc++ 头文件和库路径不在宿主机默认搜索范围内,CMake 必须配合 CMAKE_FIND_ROOT_PATH 和 CMAKE_FIND_ROOT_PATH_MODE_* 才能正确链接目标平台标准库——漏掉这个,编译可能成功,但运行时直接 Segmentation fault。


















