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

如何选择默认的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

有任何想法吗?

答案1

首先清除和的当前update-alternatives设置:gccg++

sudo update-alternatives --remove-all gcc 
sudo update-alternatives --remove-all g++

安装软件包

看起来gcc-4.3和都gcc-4.4在 install build-essential 之后安装。但是,我们可以明确安装以下软件包:

sudo apt-get install gcc-4.3 gcc-4.4 g++-4.3 g++-4.4

安装替代方案

符号链接ccc++是默认安装的。我们将为gcc和安装符号链接g++,然后分别将cc和链接c++gccg++。(请注意,、1020选项30是每个替代方案的优先级,数字越大优先级越高。)

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++

配置替代方案

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

sudo update-alternatives --config gcc
sudo update-alternatives --config g++

或者使用脚本切换:

#!/bin/sh

if [ -z "$1" ]; then
    echo "usage: $0 version" 1>&2
    exit 1
fi

if [ ! -f "/usr/bin/gcc-$1" ] || [ ! -f "/usr/bin/g++-$1" ]; then
    echo "no such version gcc/g++ installed" 1>&2
    exit 1
fi

update-alternatives --set gcc "/usr/bin/gcc-$1"
update-alternatives --set g++ "/usr/bin/g++-$1"

答案2

在终端中执行:

gcc -v
g++ -v

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

  • 您可以看到符号链接:
ls -la /usr/bin | grep gcc-4.4
ls -la /usr/bin | grep g++-4.4
  • 因此我们需要做的是删除 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++
  • 现在,如果我们再次检查符号链接,我们将看到 GCC 和 G++ 现在链接到 GCC 4.3 和 G++ 4.3:
ls -la /usr/bin/ | grep gcc
ls -la /usr/bin/ | grep g++
  • 最后,我们可以再次检查 GCC -v 并确保我们使用的是正确的版本:
gcc -v
g++ -v

答案3

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

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

如果您只想使用不同版本的 构建内容,这很容易,即使使用 makescripts 也是如此。例如,您可以在环境变量中gcc传入 的版本:gccCC

CC="gcc-4.5" ./configure
CC="gcc-4.5" make

您可能不需要在 make 命令上使用它(配置脚本通常会将其拉入)但它并没有什么坏处。

答案4

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

  1. 安装新所需的版本:
sudo apt install gcc-10
sudo apt install g++-10
  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
  1. 测试:
gcc --version
g++ --version

如果您需要切换回来,旧版本仍然会安装,只需使用第 2 行的命令和旧版本即可!

相关内容