AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / ubuntu / 问题 / 26498
Accepted
Nils
Nils
Asked: 2011-02-16 07:52:57 +0800 CST2011-02-16 07:52:57 +0800 CST 2011-02-16 07:52:57 +0800 CST

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

  • 772

所以我已经安装了 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

有任何想法吗?

gcc
  • 8 8 个回答
  • 610430 Views

8 个回答

  • Voted
  1. Best Answer
    hhlp
    2011-02-16T11:05:55+08:002011-02-16T11:05:55+08:00

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

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

    安装包

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

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

    安装替代品

    符号链接cc和c++默认安装。我们将为gcc和安装符号链接g++,然后分别链接cc和c++到gcc和g++。(请注意10,20和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++
    

    配置备选方案

    最后一步是配置 , 的默认gcc命令g++。在 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"
    
    • 363
  2. hhlp
    2011-02-16T08:49:39+08:002011-02-16T08:49:39+08:00

    在终端执行:

    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
    
    • 54
  3. Oli
    2011-02-16T08:22:37+08:002011-02-16T08:22:37+08:00

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

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

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

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

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

    • 25
  4. Ale
    2016-10-16T12:52:47+08:002016-10-16T12:52:47+08:00

    编辑:

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

    sudo apt install gcc-4.9 g++-4.9
    

    原来的:

    而对于那些懒惰的人来说,这里有一条线,只需将最后的数字更改为您想要的版本即可。它将改变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
    

    在这个例子中,我切换到 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
    

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

    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
    

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

    gcc --version
    

    半详细解释:

    • ls -la /usr/bin/列出 /usr/bin 中的所有文件
    • | 管道(发送)输出到下一个命令
    • grep -oP匹配每行的搜索正则表达式。o只显示结果而不是整个匹配行。P告诉 grep 使用 perl-regex。我不会在这里进入正则表达式,如果你愿意,请阅读它。
    • xargs简单地说,它收集通过管道传送给它的结果,并将它们全部发送到最后。即到 xargs 之后的命令
    • bash好,这是 bash。c标志告诉它使用字符串作为命令。在此示例中,它通过跳过第一个(第 0 个)参数来循环从xargs发送 的参数,在这种情况下,循环跳过4.9。第 0 个参数在循环中用于更改链接。
    • ln -s -f s标志建立一个符号链接,如果需要,f首先强制取消链接。
    • 18
  5. LC117
    2021-04-17T00:50:19+08:002021-04-17T00:50:19+08:00

    我希望从 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. 与您的旧版本!

    • 10
  6. Martin Flaska
    2020-01-28T22:58:41+08:002020-01-28T22:58:41+08:00

    我通常还将相关的 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
    
    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 --config gcc
    sudo update-alternatives --config g++
    
    • 7
  7. user643722
    2018-12-06T11:42:50+08:002018-12-06T11:42:50+08:00

    临时目录中的符号链接怎么样:

    mkdir x && PATH=$PWD/x:$PATH && ln -s /usr/bin/g++-7 $PWD/x/g++

    • 1
  8. Luis Eduardo
    2022-01-24T17:47:11+08:002022-01-24T17:47:11+08:00

    您可以使用替代命令,希望对您有所帮助!

    sudo apt install build-essential
    
    sudo apt install gcc-8 g++-8 gcc-9 g++-9 gcc-10 g++-10
    
    sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-10 100 --slave /usr/bin/g++ g++ /usr/bin/g++-10 --slave /usr/bin/gcov gcov /usr/bin/gcov-10
    
    sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-9 90 --slave /usr/bin/g++ g++ /usr/bin/g++-9 --slave /usr/bin/gcov gcov /usr/bin/gcov-9
    
    sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-8 80 --slave /usr/bin/g++ g++ /usr/bin/g++-8 --slave /usr/bin/gcov gcov /usr/bin/gcov-8
    
    sudo update-alternatives --config gcc
    

    https://snipboard.io/zE4B9D.jpg

    • -1

相关问题

  • itoa() 在 Gcc >=4.1 的 stdlib.h 中是否可用?

  • 如何安装 gcc-4.1?

  • 在哪里可以找到预编译的 gcc 3.4.6 或 2.95 ARM 交叉编译器?[关闭]

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何运行 .sh 脚本?

    • 16 个回答
  • Marko Smith

    如何安装 .tar.gz(或 .tar.bz2)文件?

    • 14 个回答
  • Marko Smith

    我需要什么命令来解压缩/提取 .tar.gz 文件?

    • 8 个回答
  • Marko Smith

    如何列出所有已安装的软件包

    • 24 个回答
  • Marko Smith

    无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗?

    • 25 个回答
  • Marko Smith

    如何使用命令行将用户添加为新的 sudoer?

    • 7 个回答
  • Marko Smith

    更改文件夹权限和所有权

    • 9 个回答
  • Martin Hope
    EmmyS 我需要什么命令来解压缩/提取 .tar.gz 文件? 2011-02-09 14:50:41 +0800 CST
  • Martin Hope
    Ivan 如何列出所有已安装的软件包 2010-12-17 18:08:49 +0800 CST
  • Martin Hope
    La Ode Adam Saputra 无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗? 2010-11-30 18:12:48 +0800 CST
  • Martin Hope
    David Barry 如何从命令行确定目录(文件夹)的总大小? 2010-08-06 10:20:23 +0800 CST
  • Martin Hope
    jfoucher “以下软件包已被保留:”为什么以及如何解决? 2010-08-01 13:59:22 +0800 CST
  • Martin Hope
    David Ashford 如何删除 PPA? 2010-07-30 01:09:42 +0800 CST

热门标签

10.10 10.04 gnome networking server command-line package-management software-recommendation sound xorg

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve