【Linux】Ubuntu22.04版本下实现gcc版本的快速切换

嚴華  金牌会员 | 2024-6-20 14:20:02 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 548|帖子 548|积分 1644

本文将介绍如安在Ubuntu22.04版本下实现gcc版本的快速切换。
   本文首发于 ❄️慕雪的寒舍
  前言

有的时候,不同版本的gcc会造成一些渺小的差异,导致相关的一些工具不兼容,好比用于单位测试覆盖率天生的gcov/lcov工具,在不同的gcc版本下可能会出现不同的效果。
为了确定是否是gcc编译器版本不同造成的这些差异,有的时候必要在一台主机上装多个版本的gcc,不绝的切换以测试问题。
假设我们的ubuntu主机上安装了gcc 11.4 版本和 gcc 9.5 版本,且当前gcc下令指向的是 11.4 版本,那么你可以使用gcc-9下令来使用9.5版本的gcc。
但是,对于一些已经写死使用gcc这个下令的脚本或编译工具而言,它们就不是那么好修改gcc为gcc-9的,我们必要做的就是让系统的gcc下令能在11.4版本和9.5版本之间举行切换
其中一个办法是手动更换gcc和g++的下令软连接,但是这个方法并不方便,ubuntu下有更好的操作,请看下文。
安装gcc9.5

默认情况下,ubuntu22.04安装的gcc版本是11.4
  1. > gcc --version         
  2. gcc (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0
  3. Copyright (C) 2021 Free Software Foundation, Inc.
  4. This is free software; see the source for copying conditions.  There is NO
  5. warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
复制代码
先给你的主机安装上gcc9.4版本
  1. sudo apt install gcc-9 g++-9
复制代码
安装之后,你应该可以通过gcc-9下令来使用9.5版本的gcc了
  1. > g++-9 --version
  2. g++-9 (Ubuntu 9.5.0-1ubuntu1~22.04) 9.5.0
  3. Copyright (C) 2019 Free Software Foundation, Inc.
  4. This is free software; see the source for copying conditions.  There is NO
  5. warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
复制代码
配置update-alternatives

我们可以将11和9版本添加到update-alternatives工具中,就可以方便的切换,不必要手动设置下令的软连接。
工具基本使用下令

如下是工具使用的一个基本示例
  1. sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-11 20 --slave /usr/bin/g++ g++ /usr/bin/g++-11
复制代码

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

使用如下下令检察当前可以用来直接更换gcc的版本号,会发现么有,因为两个gcc版本都没有到场到这个工具中。
  1. > sudo update-alternatives --config gcc
  2. update-alternatives: error: no alternatives for gcc
复制代码
使用如下下令检察一下当前装好的gcc包,可以看到有gcc 11和9。
  1. > dpkg -l | grep gcc
  2. ii  gcc                               4:11.2.0-1ubuntu1                                               amd64        GNU C compiler
  3. ii  gcc-11                            11.4.0-1ubuntu1~22.04                                           amd64        GNU C compiler
  4. ii  gcc-11-base:amd64                 11.4.0-1ubuntu1~22.04                                           amd64        GCC, the GNU Compiler Collection (base package)
  5. ii  gcc-12-base:amd64                 12.3.0-1ubuntu1~22.04                                           amd64        GCC, the GNU Compiler Collection (base package)
  6. ii  gcc-9                             9.5.0-1ubuntu1~22.04                                            amd64        GNU C compiler
  7. ii  gcc-9-base:amd64                  9.5.0-1ubuntu1~22.04                                            amd64        GCC, the GNU Compiler Collection (base package)
  8. ii  lib32gcc-s1                       12.3.0-1ubuntu1~22.04                                           amd64        GCC support library (32 bit Version)
  9. ii  libgcc-11-dev:amd64               11.4.0-1ubuntu1~22.04                                           amd64        GCC support library (development files)
  10. ii  libgcc-9-dev:amd64                9.5.0-1ubuntu1~22.04                                            amd64        GCC support library (development files)
  11. ii  libgcc-s1:amd64                   12.3.0-1ubuntu1~22.04                                           amd64        GCC support library
复制代码
执行如下下令将gcc-9添加到update-alternatives工具中,让我们可以通过config来切换gcc版本
  1. > sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-9 20 --slave /usr/bin/g++ g++ /usr/bin/g++-9
  2. update-alternatives: using /usr/bin/gcc-9 to provide /usr/bin/gcc (gcc) in auto mode
复制代码
使用如下下令检察可切换的gcc版本,因为当前只给工具里添加了一个gcc-9版本,所以会显示only one alternative,即只有一个可选项的意思,工具会以为没有啥好配置的。
  1. > sudo update-alternatives --config gcc
  2. There is only one alternative in link group gcc (providing /usr/bin/gcc): /usr/bin/gcc-9
  3. Nothing to configure.
复制代码
这时候我们可以把本来安装好的11.4版本的gcc也给添加到这个工具里面。优先级的数字可以根据你的情况自行调整
  1. sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-11 25 --slave /usr/bin/g++ g++ /usr/bin/g++-11
复制代码
切换gcc版本乐成

然后再次执行sudo update-alternatives --config gcc,此时就能看到两个版本的可选项了。
  1. > sudo update-alternatives --config gcc
  2. There are 2 choices for the alternative gcc (providing /usr/bin/gcc).
  3.   Selection    Path             Priority   Status
  4. ------------------------------------------------------------
  5. * 0            /usr/bin/gcc-9    20        auto mode
  6.   1            /usr/bin/gcc-11   20        manual mode
  7.   2            /usr/bin/gcc-9    20        manual mode
  8. Press <enter> to keep the current choice[*], or type selection number:
复制代码
键入序号来选择你必要切换的gcc版本,回车即可
  1. > gcc --version
  2. gcc (Ubuntu 9.5.0-1ubuntu1~22.04) 9.5.0
  3. Copyright (C) 2019 Free Software Foundation, Inc.
  4. This is free software; see the source for copying conditions.  There is NO
  5. warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
复制代码
可以看到,当前的系统gcc已经被换成了9.5版本的了,切换乐成!而且因为我们通过--slave配置了g++下令的更换操作,所以g++的版本也跟着一起更换成9.5了
  1. > g++ --version
  2. g++ (Ubuntu 9.5.0-1ubuntu1~22.04) 9.5.0
  3. Copyright (C) 2019 Free Software Foundation, Inc.
  4. This is free software; see the source for copying conditions.  There is NO
  5. warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
复制代码
将gcc换回gcc 11版本是相同的操作,这里不再赘述。
添加多个slave

和gcc捆绑的另有一个用于分支覆盖率检测的gcov下令,我们同样可以通过--slave选项将其绑定到版本中,让gcov的下令版本也会更着gcc版本一同切换
  1. > sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-11 25 --slave /usr/bin/g++ g++ /usr/bin/g++-11
  2. --slave /usr/bin/gcov gcov /usr/bin/gcov-11update-alternatives: updating alternative /usr/bin/gcc-11 because link group gcc has changed slave links> sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-9 20 --slave /usr/bin/g++ g++ /usr/bin/g++-9 --slave /usr/bin/gcov gcov /usr/bin/gcov-9
复制代码
此时使用sudo update-alternatives --config gcc切换gcc版本后,gcov下令的版本也会跟着变化。这样我们能保证gcov和gcc版本是同等的,不会出现不同等导致的兼容性问题。
  1. > gcov --version
  2. gcov (Ubuntu 9.5.0-1ubuntu1~22.04) 9.5.0
  3. Copyright (C) 2019 Free Software Foundation, Inc.
  4. This is free software; see the source for copying conditions.
  5. There is NO warranty; not even for MERCHANTABILITY or
  6. FITNESS FOR A PARTICULAR PURPOSE.
复制代码
从工具中删除gcc版本

如果必要从这个工具中删除某个版本,执行如下下令
  1. sudo update-alternatives --remove gcc /usr/bin/gcc-9
复制代码
删除后就无法通过该工具切换gcc版本为9了。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

嚴華

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表