【问题标题】:How to change the default GCC compiler in Ubuntu?如何更改 Ubuntu 中的默认 GCC 编译器?
【发布时间】:2011-12-11 14:02:37
【问题描述】:

我在已经有 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 文件。

【问题讨论】:

  • 对于 CXX 标志,您可以调用 CXX=gcc-3.3export CXX=gcc-3.3 然后 make 但是当您使用 update-alternatives 全局更改它时,它已经使用 gcc-3.3,这不是必需的。
  • @RoboAlex:再次更新我的答案以考虑您的 CXX 环境变量请求。但是,请注意,它只会在您稍后修改更新替代方案时使用。
  • 您只需要更改您的 PATH。大多数答案都提到了替代系统,但 Debian 和 LLVM 维护者都同意 alternatives 系统应该用于 alternatives,而不是用于 versioning我>。在我的回答中进一步解释。

标签: linux ubuntu gcc


【解决方案1】:

在 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 在它们之间进行更改。

【讨论】:

  • 在删除 ccc++ 行后工作正常,这会导致错误:替代 cc 不能成为 gcc 的奴隶:它是主替代品
【解决方案2】:

我只使用了下面的几行,它起作用了。我只是想在Ubuntu 14.04 上使用kernel 4.8.10 编译VirtualBoxVMWare WorkStation。最初,大多数事情都不起作用,例如图形和网络。我很幸运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

【讨论】:

    【解决方案3】:

    我在尝试安装新的 clang 编译器时发现了这个问题。事实证明,the Debianthe LLVM maintainers agree 都应该将替代系统用于 alternatives, 而不是 versioning

    他们提出的解决方案是这样的:
    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”套件
    【解决方案4】:

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

    • 键入echo $PATH 并查找具有非常高优先级的个人 目录(在我的例子中,我有~/.local/bin);
    • 在此目录中添加符号链接:

    例如:

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

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

    【讨论】:

    • 因此您正在创建自己的临时、与系统并行的替代系统。为什么不用实物?
    • @hmijail 正如我所解释的,当我想构建一个非常单一的项目而不弄乱我的整个安装时,我会使用这种方式。它工作得很好,之后我可以轻松删除它。
    • 仅仅改变你的 PATH 会更快、更干净,并且会让你的 gcc 相关工具彼此同步。
    【解决方案5】:

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

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

    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
    

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

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

    【讨论】:

      【解决方案6】:

      正如@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 环境变量,您需要将 @DipSwitch 指示的行放入您的 .bashrc 文件中(这将只对您的用户应用更改,我认为这更安全):

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

      【讨论】:

      • @thang 也叫cc: root@host:/root# update-alternatives --get-selections | grep '/usr/bin/gcc' cc auto /usr/bin/gcc
      • 当我运行 'update-alternatives --config gcc' 时,没有任何反应,即使我有系统的 gcc 和 anaconda 一个
      • 你怎么能自动做到这一点呢?这需要手动检查update-alternatives --query gcc 的输出,例如在自动配置脚本中可能不起作用。另外,如何使这与平台无关?
      【解决方案7】:

      This is the great description 以及如何创建和管理主从(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 40 和 60 表示分配给每个条目的优先级,请检查其他答案以获得关于该主题的更多完整性
      【解决方案8】:

      以下是 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 已经有一个带有/lib/cpp 主链接的cpp 替代品。重命名该链接将删除/lib/cpp 链接,这可能会破坏脚本.)

      【讨论】:

      • 对于未来试图将已安装的 g++-5 编译器设置为默认的懒人:sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-5 100
      • 只剩下 1 个问题:为什么 APT 在安装 g++-6 包时不这样做?
      • 我以这种方式将默认编译器切换为 g++-5,但它仍然使用 g++-7 标准库,现在我遇到了未定义的 __builtin 内容的错误。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-01-24
      • 2023-04-08
      • 1970-01-01
      • 2017-08-28
      • 1970-01-01
      • 2011-01-12
      • 1970-01-01
      相关资源
      最近更新 更多