应使用update-alternatives管理多版本gcc,因其通过--slave参数绑定gcc、g++等配套工具,确保工具链版本一致;仅改path或设alias会导致g++、gcc-ar等脱节,引发编译失败。

直接结论:别改 PATH,用 update-alternatives 管理,否则 g++、gcc-ar 等配套工具会脱节。
为什么不能只改 PATH 或写 alias?
很多人装完 gcc-13 后,在 ~/.bashrc 里加 export PATH="/usr/bin/gcc-13:$PATH",结果 gcc --version 显示对了,但 cmake 编译失败,或 g++ 还是旧版本。这是因为:
-
gcc和g++是独立二进制文件,PATH 只影响命令查找顺序,不保证它们版本一致 -
gcc-ar、gcc-nm、gcc-ranlib等配套工具不会跟着 PATH 变动自动切换 - 不同 shell(zsh/bash)、不同用户、systemd 服务环境读取的 PATH 不一致,行为不可控
update-alternatives --install 必须带 --slave
注册新版本时,--slave 参数不是可选的——它强制绑定关联工具。漏掉会导致 g++ 仍指向旧版本,编译 C++ 项目时链接失败。
正确写法示例(以 gcc-13 为例):
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-13 150 \ --slave /usr/bin/g++ g++ /usr/bin/g++-13 \ --slave /usr/bin/gcov gcov /usr/bin/gcov-13 \ --slave /usr/bin/gcc-ar gcc-ar /usr/bin/gcc-ar-13 \ --slave /usr/bin/gcc-nm gcc-nm /usr/bin/gcc-nm-13 \ --slave /usr/bin/gcc-ranlib gcc-ranlib /usr/bin/gcc-ranlib-13
注意点:
- 优先级(如
150)必须高于已注册版本,否则--config时不会出现在选项列表里 -
--slave的三元组格式是:链接路径 工具名 实际路径,顺序错一个就失效 - 路径必须真实存在,运行前先确认
ls /usr/bin/gcc-13 /usr/bin/g++-13
update-alternatives --config gcc 不生效?检查这三点
执行后终端显示版本没变,常见原因:
- 当前 shell 没重新加载配置:退出终端重开,或运行
hash -r清除命令缓存 - 你用的是 zsh 但配置只写在
~/.bashrc:把source /etc/profile.d/alternatives.sh加到~/.zshrc - 某些发行版(如 Ubuntu 24.04+)默认禁用 alternatives 初始化:检查
/etc/environment是否有ALTERNATIVES_ENABLED=0,删掉或设为1
验证是否真生效,别只信 gcc --version
单看 gcc 输出容易误判。真正要检查的是整个工具链一致性:
gcc --version<br>g++ --version<br>gcc-ar --version<br>gcov --version
四者输出的版本号必须完全一致。如果 g++ 还是 g++-11,说明 --slave 没注册成功,或者 g++ 被其他方式(如 alias 或 PATH 前置)覆盖了。
复杂点在于:update-alternatives 管理的是符号链接,而有些构建系统(如 Meson)会绕过它直读 /usr/bin/gcc-*;这时候得靠 CC=gcc-13 CXX=g++-13 meson setup builddir 显式指定。











