如何选择默认的 gcc 和 g++ 版本?

Nil*_*ils 255 gcc g++

所以我安装了 gcc-4.4 和 gcc-4.3(g++ 相同)。现在据我所知,Ubuntu 中有一个工具可以为你设置符号链接,如果你只是告诉它你想要哪个版本。然而,它似乎在最新版本中不起作用,我觉得这很令人失望。

root@nexus:~# update-alternatives --config gcc
update-alternatives: error: no alternatives for gcc.
root@nexus:~# update-alternatives --config cc
There is only one alternative in link group cc: /usr/bin/gcc
Nothing to configure.


root@nexus:~# dpkg -l | grep gcc | awk '{print $2}'
gcc
gcc-4.3
gcc-4.3-base
gcc-4.3-multilib
gcc-4.4
gcc-4.4-base
gcc-4.4-multilib
gcc-4.5-base
gcc-multilib
lib32gcc1
libgcc1
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

hhl*_*hlp 344

首先擦除当前update-alternatives设置为gccg++

sudo update-alternatives --remove-all gcc 
sudo update-alternatives --remove-all g++
Run Code Online (Sandbox Code Playgroud)

安装包

似乎在 install build-essential 之后都安装了gcc-4.3gcc-4.4。但是,我们可以显式安装以下软件包:

sudo apt-get install gcc-4.3 gcc-4.4 g++-4.3 g++-4.4
Run Code Online (Sandbox Code Playgroud)

安装替代品

符号链接ccc++默认安装。我们将安装符号链接,gccg++,然后链接ccc++gccg++分别。(请注意,102030选项是每个选项的优先级,其中数字越大优先级越高。)

sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.3 10
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.4 20

sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.3 10
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.4 20

sudo update-alternatives --install /usr/bin/cc cc /usr/bin/gcc 30
sudo update-alternatives --set cc /usr/bin/gcc

sudo update-alternatives --install /usr/bin/c++ c++ /usr/bin/g++ 30
sudo update-alternatives --set c++ /usr/bin/g++
Run Code Online (Sandbox Code Playgroud)

配置替代方案

最后的步骤是配置默认命令的gccg++。在 4.3 和 4.4 之间交互切换很容易:

sudo update-alternatives --config gcc
sudo update-alternatives --config g++
Run Code Online (Sandbox Code Playgroud)

或者使用脚本切换:

sudo update-alternatives --remove-all gcc 
sudo update-alternatives --remove-all g++
Run Code Online (Sandbox Code Playgroud)

  • 根据联机帮助页,事实证明这些数字是优先事项。我想如果其中一个版本被卸载,它将使用这些优先级来确定哪个应该成为新的默认值。 (7认同)
  • Thx,因此您必须手动将它们添加到更新替代品中。IIRC 早期的 Ubuntu 版本会自动执行此操作。 (4认同)

hhl*_*hlp 51

在终端执行:

gcc -v
g++ -v
Run Code Online (Sandbox Code Playgroud)

好的,这部分相当简单。棘手的部分是,当您发出 GCC 命令时,它实际上是指向您正在使用的 GCC 版本的符号链接。这意味着我们可以创建一个从 GCC 到我们想要的任何 GCC 版本的符号链接。

  • 您可以看到符号链接:
ls -la /usr/bin | grep gcc-4.4
ls -la /usr/bin | grep g++-4.4
Run Code Online (Sandbox Code Playgroud)
  • 所以我们需要做的是删除 GCC 符号链接和 G++ 符号链接,然后重新创建它们链接到 GCC 4.3 和 G++ 4.3:
rm /usr/bin/gcc
rm /usr/bin/g++

ln -s /usr/bin/gcc-4.3 /usr/bin/gcc
ln -s /usr/bin/g++-4.3 /usr/bin/g++
Run Code Online (Sandbox Code Playgroud)
  • 现在,如果我们再次检查符号链接,我们将看到 GCC 和 G++ 现在链接到 GCC 4.3 和 G++ 4.3:
ls -la /usr/bin/ | grep gcc
ls -la /usr/bin/ | grep g++
Run Code Online (Sandbox Code Playgroud)
  • 最后我们可以再次检查我们的 GCC -v 并确保我们使用的是正确的版本:
gcc -v
g++ -v
Run Code Online (Sandbox Code Playgroud)


Oli*_*Oli 24

这真的是可取的吗?gcc版本之间存在 ABI 更改。用一个版本(例如整个操作系统)编译某些东西,然后用另一个版本编译其他东西,可能会导致冲突。

例如,内核模块应始终gcc使用用于编译内核的相同版本进行编译。考虑到这一点,如果您手动更改了/usr/bin/gccUbuntu 版本中使用的版本之间的符号链接,未来的 DKMS 构建模块可能会使用错误的gcc版本。

如果您只想使用不同版本的gcc. 例如,您可以gccCC环境变量中传入版本:

CC="gcc-4.5" ./configure
CC="gcc-4.5" make
Run Code Online (Sandbox Code Playgroud)

您可能不需要在 make 命令中使用它(配置脚本通常将其拉入),但它不会受到伤害。

  • 谢谢您的评论。我知道 CC 变量,但这并不是真正的问题。 (2认同)
  • 确实如此,但我已经解释了为什么 `gcc` 不是 `alternatives` 系统的一部分,以及为什么这不是特别理想的。如果这些都不会改变您的想法,只需手动完成即可。 (2认同)
  • 你能解释为什么每次调用的环境变量比系统范围的配置设置更可取吗?`$ sudo apt-get install gcc-6 gcc-7 $ CC="gcc-7" ./configure <much output> $ make # 使用 gcc-7 ` 而 `sudo update-alternatives gcc gcc-7`确保您不会意外切换 ABI。 (2认同)

Ale*_*Ale 18

编辑:

这假设您首先安装了该版本,例如:

sudo apt install gcc-4.9 g++-4.9
Run Code Online (Sandbox Code Playgroud)

原来的:

这里有一个单行,适合懒惰的人,只需将末尾的数字更改为您想要的版本即可。它将对gcc和/或g++进行更改

ls -la /usr/bin/ | grep -oP "[\S]*(gcc|g\+\+)(-[a-z]+)*[\s]" | xargs bash -c 'for link in ${@:1}; do sudo ln -s -f "/usr/bin/${link}-${0}" "/usr/bin/${link}"; done' 4.9
Run Code Online (Sandbox Code Playgroud)

在这个例子中,我切换到 4.9

在这个例子中没有错误检查和什么没有,所以你可能想在运行之前检查将运行什么。只需在sudo之前添加echo。为了完整起见,我还提供了检查行:

ls -la /usr/bin/ | grep -oP "[\S]*(gcc|g\+\+)(-[a-z]+)*[\s]" | xargs bash -c 'for link in ${@:1}; do echo sudo ln -s -f "/usr/bin/${link}-${0}" "/usr/bin/${link}"; done' 4.9
Run Code Online (Sandbox Code Playgroud)

检查的输出应该是这样的:

sudo ln -s -f /usr/bin/g++-4.9 /usr/bin/g++
sudo ln -s -f /usr/bin/gcc-4.9 /usr/bin/gcc
sudo ln -s -f /usr/bin/gcc-ar-4.9 /usr/bin/gcc-ar
sudo ln -s -f /usr/bin/gcc-nm-4.9 /usr/bin/gcc-nm
sudo ln -s -f /usr/bin/gcc-ranlib-4.9 /usr/bin/gcc-ranlib
sudo ln -s -f /usr/bin/x86_64-linux-gnu-g++-4.9 /usr/bin/x86_64-linux-gnu-g++
sudo ln -s -f /usr/bin/x86_64-linux-gnu-gcc-4.9 /usr/bin/x86_64-linux-gnu-gcc
sudo ln -s -f /usr/bin/x86_64-linux-gnu-gcc-ar-4.9 /usr/bin/x86_64-linux-gnu-gcc-ar
sudo ln -s -f /usr/bin/x86_64-linux-gnu-gcc-nm-4.9 /usr/bin/x86_64-linux-gnu-gcc-nm
sudo ln -s -f /usr/bin/x86_64-linux-gnu-gcc-ranlib-4.9 /usr/bin/x86_64-linux-gnu-gcc-ranlib
Run Code Online (Sandbox Code Playgroud)

您可以使用以下命令检查版本:

gcc --version
Run Code Online (Sandbox Code Playgroud)

半详细解释:

  • LS -la在/ usr / bin中/列表中的所有文件在/ usr / bin中
  • | 管道(发送)输出到下一个命令
  • grep -oP匹配每行的搜索正则表达式。o只显示结果而不是整个匹配的行。P告诉 grep 使用 perl-regex。我不会在这里讨论正则表达式,如果你想阅读它。
  • xargs简单地说,它收集通过管道传输到它的结果并将所有结果发送到最后。即到 xargs 后面的命令
  • bash好,它是 bash。该Ç标志告诉它要使用的字符串作为命令。在这个例子中,它 通过跳过第一个(第 0 个)参数来循环从xargs发送的参数,在这种情况下循环跳过4.9。循环中使用第 0 个参数来更改链接。
  • LN -s -f小号标志的一个符号链接,˚F力量如果需要取消关联首。

  • 很老的问题,但这个答案似乎是我们在查看旧帖子的答案时应该寻找的宝石之一...... (2认同)

小智 18

我希望从 gcc/g++ 9.x (已安装)切换到 10.x:

  1. 安装了所需的新版本:
sudo apt install gcc-10
sudo apt install g++-10
Run Code Online (Sandbox Code Playgroud)
  1. 切换到新版本:
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-10 10
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-10 10
Run Code Online (Sandbox Code Playgroud)
  1. 测试:
gcc --version
g++ --version
Run Code Online (Sandbox Code Playgroud)

旧版本仍然安装,以防您需要切换回来,只需使用旧版本的命令形式 2. 即可!


Mar*_*ska 5

我通常也将相关的 gcc 工具 ( gcc-ar, ...) 配置为从属工具,因此您可以一次切换所有这些工具:

sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.3 10 \
    --slave /usr/bin/gcc-ar gcc-ar /usr/bin/gcc-ar-4.3 \
    --slave /usr/bin/gcc-nm gcc-nm /usr/bin/gcc-nm-4.3 \
    --slave /usr/bin/gcc-ranlib gcc-ranlib /usr/bin/gcc-ranlib-4.3

sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.4 20 \
    --slave /usr/bin/gcc-ar gcc-ar /usr/bin/gcc-ar-4.4 \
    --slave /usr/bin/gcc-nm gcc-nm /usr/bin/gcc-nm-4.4 \
    --slave /usr/bin/gcc-ranlib gcc-ranlib /usr/bin/gcc-ranlib-4.4
Run Code Online (Sandbox Code Playgroud)
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.3 10
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.4 20
Run Code Online (Sandbox Code Playgroud)

然后选择默认的:

sudo update-alternatives --config gcc
sudo update-alternatives --config g++
Run Code Online (Sandbox Code Playgroud)