logo 🤗

技术视野

聚焦科技前沿,分享技术解析,洞见未来趋势。在这里,与您一起探索人工智能的无限可能,共赴技术盛宴。

背景

  • 本文将介绍如何在Ubuntu24.04版本下实现gcc版本的快速切换。
  • 由于cuda12.1不支持最新的gcc-13,所以我们需要手动安装gcc-11/g++-11,并且在使用cuda时候将默认gcc版本切换成gcc-11,但是在更新内核或者nvidia驱动时有需要还原到gcc-13,否则linux内核会无法启用nvidia驱动。
  • 参考链接

准备工作

  1. 默认情况下,ubuntu24.04安装的gcc版本是13.2
$gcc --version
gcc (Ubuntu 13.2.0-23ubuntu4) 13.2.0
Copyright (C) 2023 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  1. 先给你的主机安装上gcc-11版本
sudo apt install gcc-11 g++-11
  1. 安装之后,你应该可以通过gcc-11命令来使用11版本的gcc了
$gcc-11 --version
gcc-11 (Ubuntu 11.4.0-9ubuntu1) 11.4.0
Copyright (C) 2021 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

配置update-alternatives

  1. 使用该工具,我们可以将13和11版本添加到update-alternatives工具中,就可以方便的切换,不需要手动设置命令的软连接。
  2. 如下是工具使用的一个基本示例
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-11 20 --slave /usr/bin/g++ g++ /usr/bin/g++-11
  1. --install 代表我们需要注册一个新的服务名
  2. /usr/bin/gcc 代表我们目标的最终地址,切换软链接的时候会切换该地址的软链接
  3. gcc代表我们用于管理服务的名字
  4. /usr/bin/gcc-11 代表被管理的命令的绝对路径(会用这个命令来替换第二个参数的软链接)
  5. 20 代表优先级,数字越大优先级越高。
  6. --slave 代表从属命令,参数顺序和前面这几个是一样的,配置的是g++命令
  7. 在update-alternatives命令的帮助中可以看到install和slave的关系,slave命令就是跟着install命令来使用的
--install <link> <name> <path> <priority> [--slave <link> <name> <path>] ... 
add a group of alternatives to the system.
  1. 它是什么意思呢?其实就是让主从命令有一个对应关系:当我们把gcc命令切换成11版本后,作为slave的g++命令也会跟着一起变化。
  2. slave可以添加多个,后文会做演示。

添加gcc版本配置

  1. 使用如下命令查看当前可以用来直接替换gcc的版本号,会发现只有刚刚添加进去的gcc-11
$sudo update-alternatives --config gcc
有 1 个候选项可用于替换 gcc (提供 /usr/bin/gcc)。

  选择       路径           优先级  状态
------------------------------------------------------------
* 0            /usr/bin/gcc-11   20        自动模式
  1            /usr/bin/gcc-11   20        手动模式
  1. 执行如下命令将gcc-13也添加到update-alternatives工具中,让我们可以通过config来切换gcc版本
$sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-13 20 --slave /usr/bin/g++ g++ /usr/bin/g++-13

update-alternatives: using /usr/bin/gcc-13 to provide /usr/bin/gcc (gcc) in auto mode
  1. 使用如下命令查看可切换的gcc版本,现在可以看到有两个模式了,当前使用的是gcc-11
$sudo update-alternatives --config gcc

有 2 个候选项可用于替换 gcc (提供 /usr/bin/gcc)。

  选择       路径           优先级  状态
------------------------------------------------------------
* 0            /usr/bin/gcc-11   20        自动模式
  1            /usr/bin/gcc-11   20        手动模式
  2            /usr/bin/gcc-13   20        手动模式
要维持当前值[*]请按<回车键>,或者键入选择的编号:
  1. 键入序号来选择你需要切换的gcc版本,回车即可,这里输入2测试一下,即gcc-13
要维持当前值[*]请按<回车键>,或者键入选择的编号:2
update-alternatives: 使用 /usr/bin/gcc-13 来在手动模式中提供 /usr/bin/gcc (gcc)

$gcc --version
gcc (Ubuntu 13.2.0-23ubuntu4) 13.2.0
Copyright (C) 2023 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

$g++ --version
g++ (Ubuntu 13.2.0-23ubuntu4) 13.2.0
Copyright (C) 2023 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  1. 可以看到,当前的系统gcc已经被换成了13版本的了,切换成功!而且因为我们通过--slave配置了g命令的替换操作,所以g的版本也跟着一起替换成13了
  2. 将gcc换回gcc 11版本是相同的操作,这里不再赘述。

添加多个slave

  1. 和gcc捆绑的还有一个用于分支覆盖率检测的gcov命令,我们同样可以通过--slave选项将其绑定到版本中,让gcov的命令版本也会更着gcc版本一同切换
  • 添加gcc-11的完全版(将优先级更新为25,同名会更新)
$sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-11 25 --slave /usr/bin/g++ g++ /usr/bin/g++-11 --slave /usr/bin/gcov gcov /usr/bin/gcov-11

update-alternatives: 链接组 gcc 已更改次要链接,故更新候选项 /usr/bin/gcc-11
  • 添加gcc-13的完全版
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-13 20 --slave /usr/bin/g++ g++ /usr/bin/g++-13 --slave /usr/bin/gcov gcov /usr/bin/gcov-13
  1. 此时使用sudo update-alternatives --config gcc切换gcc版本后,gcov命令的版本也会跟着变化。这样我们能保证gcov和gcc版本是一致的,不会出现不一致导致的兼容性问题。
$sudo update-alternatives --config gcc
有 2 个候选项可用于替换 gcc (提供 /usr/bin/gcc)。

  选择       路径           优先级  状态
------------------------------------------------------------
  0            /usr/bin/gcc-11   25        自动模式
* 1            /usr/bin/gcc-11   25        手动模式
  2            /usr/bin/gcc-13   20        手动模式

要维持当前值[*]请按<回车键>,或者键入选择的编号:0

$ gcc --version 
gcc (Ubuntu 11.4.0-9ubuntu1) 11.4.0
Copyright (C) 2021 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

$ g++ --version
g++ (Ubuntu 11.4.0-9ubuntu1) 11.4.0
Copyright (C) 2021 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

$ gcov --version
gcov (Ubuntu 11.4.0-9ubuntu1) 11.4.0
Copyright (C) 2021 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

从工具中删除gcc版本

如果需要从这个工具中删除某个版本,执行如下命令,删除后就无法通过该工具切换gcc版本为13了。

sudo update-alternatives --remove gcc /usr/bin/gcc-13

版权属于:tlntin
作品采用:本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。
更新于: 2024年04月21日 11:12


39 文章数
5 分类数
40 页面数
已在风雨中度过 1年160天12小时14分
目录
来自 《Ubuntu24.04版本下实现gcc版本的快速切换》
暗黑模式
暗黑模式
返回顶部
暗黑模式
暗黑模式
返回顶部