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


95

我已经在已经具有gcc / g ++-4.4的ubuntu 11.04上安装了gcc-3.3 / g ++-3.3。所以在我的系统中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文件。


2
对于CXX标志,可以调用CXX=gcc-3.3export CXX=gcc-3.3,然后make在全局范围内update-alternatives对其进行更改时将已经使用gcc-3.3,这不是必需的。
2011年

1
@RoboAlex:再次更新了我的答案,以考虑您的CXX环境变​​量请求。但是,请注意,只有在以后修改更新替代方案的情况下,它才有用。
jopasserat 2011年

您只需要更改PATH。大部分的答案提到的替代系统,但无论是Debian和LLVM的维护者同意替代系统应该用于替代,而不是版本。我的答案进一步解释。
hmijail哀悼辞职者,2017年

Answers:


112

如@Tommy所建议,您应该使用update-alternatives
它为系列的每个软件分配值,以便它定义应用程序的调用顺序。

它用于维护系统上同一软件的不同版本。在您的情况下,您将可以使用的多个偏角gcc,并且将偏爱一个。

要弄清楚当前gcc的优先级,请键入@tripleee的注释指出的命令:

update-alternatives --query gcc

现在,请注意归因于的优先级,gcc-4.4因为您需要给赋予更高的优先级gcc-3.3
要设置替代方案,您应该有类似以下内容(假设您的gcc安装位于/usr/bin/gcc-3.3,并且gcc-4.4优先级小于50)

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

- 编辑 -

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

-编辑2-

现在,要在系统范围内修复CXX环境变​​量,您需要在.bashrc文件中放入@DipSwitch指示的行(这将仅对您的用户应用更改,我认为这更安全):

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

1
@thang也叫ccroot@host:/root# update-alternatives --get-selections | grep '/usr/bin/gcc' cc auto /usr/bin/gcc
jopasserat

当我运行'update-alternatives --config gcc'时,什么都没有发生,即使我拥有系统的gcc和anaconda也是如此
Kelthar

您怎么能自动执行此操作?这需要手动步骤来检查的输出update-alternatives --query gcc,例如在自动配置脚本中可能不起作用。另外,如何使平台不可知?
伊利

68

这是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链接,这可能会破坏脚本。)


8
对于将来的懒惰者,尝试将已安装的g ++-5编译器设置为默认值:sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-5 100
imallett

仅剩下一个问题:为什么安装g++-6软件包时APT不这样做?
rustyx

我以这种方式将默认编译器切换为g ++-5,但它仍使用g ++-7标准库,现在我遇到了未定义__builtin内容的错误。
Youda008 '19

22

这是对如何创建和管理主从(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

40和60是什么。我正在尝试使用gcc-6。
nyxee

@nyxee 40和60表示分配给每个条目的优先级,请检查其他答案以确保该主题的完整性
jopasserat

10

在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


2
删除ccc++ 行后工作正常,这会导致错误:替代cc不能作为gcc的从属:它是主要替代方法
palik

7

现在,有gcc-4.9可用于Ubuntu / precise。

创建一组编译器替代方案,其中发行版编译器具有更高的优先级:

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

注意:使用gcc版本开关会自动更改g ++版本。由于存在“ cpp”主替代项,因此必须单独完成cpp-bin。

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

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

恢复发行版编译器设置(此处:回到v4.6):

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

2

我在尝试安装新的clang编译器时发现了此问题。事实证明,DebianLLVM维护人员都同意,替代系统应该用于替代,而不是用于版本控制

他们提出的解决方案是这样的:
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-defaults(或gcc-defaults)的软件包,这可能会提供其他方式(我没有使用过)。


优秀的解决方案!我用它来选择定制的“ gcc”套件
Mad Calm

1

如果您出于个人目的想要一种更快(但仍然很干净)的方法来实现它(例如,如果您要构建对编译器版本有严格要求的特定项目),请按照以下步骤操作:

  • 输入echo $PATH并查找具有很高优先级的个人目录(在我的情况下,我有~/.local/bin);
  • 在此目录中添加符号链接:

例如:

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

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


因此,您正在创建自己的,与系统并行的替代系统。为什么不使用真实的东西?
hmijail哀悼辞职者,2016年

@hmijail正如我所解释的,当我要构建一个非常单一的项目而不弄乱整个安装过程时,会使用这种方式。它工作得很好,以后我可以轻松删除它。
Thomas Baruchel

1
只需更改PATH即可更快,更清洁,并使与gcc相关的工具彼此同步。
hmijail哀悼辞职者,2016年

0

我只使用了下面的行,它起作用了。我只是想编写VirtualBoxVMWare WorkStation使用kernel 4.8.10Ubuntu 14.04。最初,大多数事物都无法正常工作,例如图形和网络。我很幸运的VMWare workstation要求gcc 6.2.0。我无法启动我的Genymotion Android emulators帐户,因为virtualbox已关闭。如有必要,将稍后发布结果。

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.