问题

软件 >> Linux >> openSUSE
Questions in category: openSUSE (openSUSE).

通过添加 GCC 7 和 GCC 15 到 alternatives 实现 gcc 版本的自动切换

Posted by haifeng on 2026-08-31 09:50:34 last update 2026-08-31 09:52:54 | Answers (0) | 收藏


以 openSUSE Leap 15.6 为例, 现在已经同时安装了 7.5.0 和 15 两个版本. 可以在 /usr/bin 目录下键入命令 ls -l gcc* 查看

haifeng@localhost:/usr/bin> ls -l gcc*
lrwxrwxrwx 1 root root       5  8月 23  2021 gcc -> gcc-7
-rwxr-xr-x 2 root root 2210656  2月 10  2026 gcc-15
-rwxr-xr-x 1 root root 1026488  1月 25  2025 gcc-7
lrwxrwxrwx 1 root root       8  8月 23  2021 gcc-ar -> gcc-ar-7
-rwxr-xr-x 1 root root   35488  2月 10  2026 gcc-ar-15
-rwxr-xr-x 1 root root   31168  1月 25  2025 gcc-ar-7
lrwxrwxrwx 1 root root       8  8月 23  2021 gcc-nm -> gcc-nm-7
-rwxr-xr-x 1 root root   35488  2月 10  2026 gcc-nm-15
-rwxr-xr-x 1 root root   31168  1月 25  2025 gcc-nm-7
lrwxrwxrwx 1 root root      12  8月 23  2021 gcc-ranlib -> gcc-ranlib-7
-rwxr-xr-x 1 root root   35488  2月 10  2026 gcc-ranlib-15
-rwxr-xr-x 1 root root   31168  1月 25  2025 gcc-ranlib-7

 

haifeng@localhost:/usr/bin> sudo update-alternatives --list gcc
update-alternatives: error: no alternatives for gcc

 

这说明 gcc 的 alternatives 还没有配置. 如果已经设置了配置, 则可以先删除.

# 1. 删除 g++ 的独立 alternatives 配置
sudo update-alternatives --remove-all g++

# 2. 删除 gcc 的旧配置(如果有的话)
sudo update-alternatives --remove-all gcc

# 3. 重新注册 gcc,同时将 g++ 作为从属
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-15 150 \
  --slave /usr/bin/g++ g++ /usr/bin/g++-15 \
  --slave /usr/bin/gcc-ar gcc-ar /usr/bin/gcc-ar-15 \
  --slave /usr/bin/gcc-nm gcc-nm /usr/bin/gcc-nm-15 \
  --slave /usr/bin/gcc-ranlib gcc-ranlib /usr/bin/gcc-ranlib-15

# 4. 注册 GCC 7(优先级低一些)
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-7 70 \
  --slave /usr/bin/g++ g++ /usr/bin/g++-7 \
  --slave /usr/bin/gcc-ar gcc-ar /usr/bin/gcc-ar-7 \
  --slave /usr/bin/gcc-nm gcc-nm /usr/bin/gcc-nm-7 \
  --slave /usr/bin/gcc-ranlib gcc-ranlib /usr/bin/gcc-ranlib-7

这里数字(70、150)是优先级,数值越大优先级越高。这里给 GCC 15 设了更高的优先级 150,GCC 7 是 70。

 

查看

haifeng@localhost:/usr/bin> ls -la /etc/alternatives/ | grep -E "gcc|g\\+\\+"
lrwxrwxrwx 1 root root   19  8月 29 17:34 clang++ -> /usr/bin/clang++-17
lrwxrwxrwx 1 root root   15  8月 31 09:48 g++ -> /usr/bin/g++-15
lrwxrwxrwx 1 root root   15  8月 31 09:48 gcc -> /usr/bin/gcc-15
lrwxrwxrwx 1 root root   18  8月 31 09:48 gcc-ar -> /usr/bin/gcc-ar-15
lrwxrwxrwx 1 root root   18  8月 31 09:48 gcc-nm -> /usr/bin/gcc-nm-15
lrwxrwxrwx 1 root root   22  8月 31 09:48 gcc-ranlib -> /usr/bin/gcc-ranlib-15


 

验证

haifeng@localhost:/usr/bin> gcc --version
gcc (SUSE Linux) 15.2.0
Copyright (C) 2025 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

haifeng@localhost:/usr/bin> g++ --version
g++ (SUSE Linux) 15.2.0
Copyright (C) 2025 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.