如何在 Ubuntu 中更改默认的 GCC 编译器?

我已经在 ubuntu 11.04上安装了 gcc-3.3/g + +-3.3,它已经有 gcc/g + +-4.4了。所以在我的系统中,gcc-3.3和4.4都是可用的。我可以随心所欲地调用这两个编译器。如果我只调用命令 gcc,那么 gcc-4.4将被调用。要调用 gcc-3.3,我必须使用命令 gcc-3.3

如何将默认编译器更改为 gcc-3.3?当我执行命令 gcc时,它应该调用 gcc-3.3,而不是 gcc-4.4。

另外,如何将 make 文件中的变量 CXX 更改为 gcc-3.3?我希望更改系统中的一个公共全局位置,而不是更改所有 make 文件。

309522 次浏览

正如@Tommy 建议的,你应该使用 update-alternatives
它为一个家族中的每个软件赋值,以便定义调用应用程序的顺序。

它用于在系统上维护同一软件的不同版本。在您的情况下,您将能够使用几个倾斜的 gcc,一个将受到青睐。

要计算出 gcc 当前的优先级,输入@tripleee 的注释中指出的命令:

update-alternatives --query gcc

现在,请注意属于 gcc-4.4的优先级,因为您需要给予 gcc-3.3更高的优先级。
为了设置你的备选方案,你应该有这样的 (assuming your ABC0 installation is located at ABC1, and gcc-4.4's priority is less than 50):

update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-3.3 50

编辑

最后,还可以使用 update-alternatives的交互式界面轻松地在不同版本之间切换。键入 update-alternatives --config gcc,要求在安装的版本中选择要使用的 gcc 版本。

——编辑2——

Now, to fix the CXX environment variable systemwide, you need to put the line indicated by @DipSwitch's in your .bashrc file (this will apply the change only for your user, which is safer in my opinion):

echo 'export CXX=/usr/bin/gcc-3.3' >> ~/.bashrc

下面是 jHackTheRipper 对 TL; DR 群体的回答的一个完整例子。在这种情况下,我想在默认为4.6的 Ubuntu 系统上运行 g + +-4.5。作为 root:

apt-get install g++-4.5
update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.6 100
update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.5 50
update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.6 100
update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.5 50
update-alternatives --install /usr/bin/cpp cpp-bin /usr/bin/cpp-4.6 100
update-alternatives --install /usr/bin/cpp cpp-bin /usr/bin/cpp-4.5 50
update-alternatives --set g++ /usr/bin/g++-4.5
update-alternatives --set gcc /usr/bin/gcc-4.5
update-alternatives --set cpp-bin /usr/bin/cpp-4.5

在这里,4.6仍然是默认的(也就是“自动模式”) ,但是我显式地暂时切换到4.5(手动模式)。回到4.6:

update-alternatives --auto g++
update-alternatives --auto gcc
update-alternatives --auto cpp-bin

(请注意使用 cpp-bin而不仅仅是 cpp。Ubuntu 已经有了一个 cpp替代品,它有一个 /lib/cpp的主链接。重命名该链接将删除 /lib/cpp链接,这可能会破坏脚本。)

这是关于如何创建和管理主从(gcc 和 g + +)备选方案的详细描述 和逐步指令。

简而言之就是:

sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.6 60 --slave /usr/bin/g++ g++ /usr/bin/g++-4.6
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.7 40 --slave /usr/bin/g++ g++ /usr/bin/g++-4.7
sudo update-alternatives --config gcc

现在,可以使用 gcc-4.9来支持 Ubuntu/Precision。

Create a group of compiler alternatives where the distro compiler has a higher priority:

root$ VER=4.6 ; PRIO=60
root$ update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-$VER $PRIO --slave /usr/bin/g++ g++ /usr/bin/g++-$VER
root$ update-alternatives --install /usr/bin/cpp cpp-bin /usr/bin/cpp-$VER $PRIO


root$ VER=4.9 ; PRIO=40
root$ update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-$VER $PRIO --slave /usr/bin/g++ g++ /usr/bin/g++-$VER
root$ update-alternatives --install /usr/bin/cpp cpp-bin /usr/bin/cpp-$VER $PRIO

注意: g + + 版本通过 gcc 版本开关自动更改。Cpp-bin 必须单独完成,因为存在一个“ cpp”主备选方案。

列出可用的编译器替代品:

root$ update-alternatives --list gcc
root$ update-alternatives --list cpp-bin

要手动选择 gcc、 g + + 和 cpp 的4.9版本,请执行以下操作:

root$ update-alternatives --config gcc
root$ update-alternatives --config cpp-bin

检查编译器版本:

root$ for i in gcc g++ cpp ; do $i --version ; done

Restore distro compiler settings (here: back to v4.6):

root$ update-alternatives --auto gcc
root$ update-alternatives --auto cpp-bin

如果你想用一种更快捷(但仍然非常干净)的方式来实现个人目的(例如,如果你想构建一个对编译器版本有强烈要求的特定项目) ,只需遵循以下步骤:

  • 键入 echo $PATH并查找具有非常高优先级的 私事目录(在我的例子中,我有 ~/.local/bin) ;
  • add the symbolic links in this directory:

例如:

ln -s /usr/bin/gcc-WHATEVER ~/.local/bin/gcc
ln -s /usr/bin/g++-WHATEVER ~/.local/bin/g++

当然,这只适用于单个用户(它不是系统范围的解决方案) ,但另一方面,我不喜欢在安装过程中更改太多东西。

我在尝试安装一个新的 clang 编译器时发现了这个问题。结果表明,无论是 Debianthe LLVM maintainers agree的替代系统应该用于 alternatives,而不是 版本控制

The solution they propose is something like this:
PATH=/usr/lib/llvm-3.7/bin:$PATH
其中/usr/lib/llvm-3.7/bin 是一个由 llvm-3.7包创建的目录,其中包含所有名称不带后缀的工具。这样,llvm-config (版本3.7)将显示在 PATH 中,其名称为普通名称。不需要使用符号链接,也不需要调用安装在/usr/bin 中的 llvm-config-3.7。

另外,检查一个名为 llvm-default (或 gcc-default)的包,它可能提供了其他方法(我没有使用它)。

我只用了下面的几行,就成功了。我只是想用 kernel 4.8.10Ubuntu 14.04上编译 VirtualBoxVMWare WorkStation。最初,大多数东西不工作,例如图形和网络。我很幸运,VMWare workstation要求 gcc 6.2.0。我无法启动我的 Genymotion Android emulators因为虚拟机坏了。如果需要,将在以后公布结果。

VER=4.6 ; PRIO=60
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-$VER $PRIO --slave /usr/bin/g++ g++ /usr/bin/g++-$VER
VER=6 ; PRIO=50
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-$VER $PRIO --slave /usr/bin/g++ g++ /usr/bin/g++-$VER
VER=4.8 ; PRIO=40
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-$VER $PRIO --slave /usr/bin/g++ g++ /usr/bin/g++-$VER

在4.8到6之间,所有的 --slaves:

update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.8 \
10 \
--slave   /usr/bin/cc cc /usr/bin/gcc-4.8 \
--slave   /usr/bin/c++ c++ /usr/bin/g++-4.8 \
--slave   /usr/bin/g++ g++ /usr/bin/g++-4.8 \
--slave   /usr/bin/gcov gcov /usr/bin/gcov-4.8 \
--slave   /usr/bin/gcov-dump gcov-dump /usr/bin/gcov-dump-4.8 \
--slave   /usr/bin/gcov-tool gcov-tool /usr/bin/gcov-tool-4.8 \
--slave   /usr/bin/gcc-ar gcc-ar /usr/bin/gcc-ar-4.8 \
--slave   /usr/bin/gcc-nm gcc-nm /usr/bin/gcc-nm-4.8 \
--slave   /usr/bin/gcc-ranlib gcc-ranlib /usr/bin/gcc-ranlib-4.8

还有

update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-6 \
15 \
--slave   /usr/bin/cc cc /usr/bin/gcc-6 \
--slave   /usr/bin/c++ c++ /usr/bin/g++-6 \
--slave   /usr/bin/g++ g++ /usr/bin/g++-6 \
--slave   /usr/bin/gcov gcov /usr/bin/gcov-6 \
--slave   /usr/bin/gcov-dump gcov-dump /usr/bin/gcov-dump-6 \
--slave   /usr/bin/gcov-tool gcov-tool /usr/bin/gcov-tool-6 \
--slave   /usr/bin/gcc-ar gcc-ar /usr/bin/gcc-ar-6 \
--slave   /usr/bin/gcc-nm gcc-nm /usr/bin/gcc-nm-6 \
--slave   /usr/bin/gcc-ranlib gcc-ranlib /usr/bin/gcc-ranlib-6

update-alternatives --config gcc在它们之间切换。