住房和城乡建设部网站公布信息,如何做学校网站app,wordpress优惠码,生活常识网站源码本文将介绍如何在Ubuntu22.04版本下实现gcc版本的快速切换。 本文首发于 ❄️慕雪的寒舍 前言
有的时候#xff0c;不同版本的gcc会造成一些细微的差异#xff0c;导致相关的一些工具不兼容#xff0c;比如用于单元测试覆盖率生成的gcov/lcov工具#xff0c;在不同的gcc版…本文将介绍如何在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 gcc --version
gcc (Ubuntu 11.4.0-1ubuntu1~22.04) 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.先给你的主机安装上gcc9.4版本
sudo apt install gcc-9 g-9安装之后你应该可以通过gcc-9命令来使用9.5版本的gcc了 g-9 --version
g-9 (Ubuntu 9.5.0-1ubuntu1~22.04) 9.5.0
Copyright (C) 2019 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
我们可以将11和9版本添加到update-alternatives工具中就可以方便的切换不需要手动设置命令的软连接。
工具基本使用命令
如下是工具使用的一个基本示例
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命令来使用的 --install link name path priority[--slave link name path] ...add a group of alternatives to the system.它是什么意思呢其实就是让主从命令有一个对应关系当我们把gcc命令切换成11版本后作为slave的g命令也会跟着一起变化。
slave可以添加多个后文会做演示。
添加gcc版本配置
使用如下命令查看当前可以用来直接替换gcc的版本号会发现么有因为两个gcc版本都没有加入到这个工具中。 sudo update-alternatives --config gcc
update-alternatives: error: no alternatives for gcc使用如下命令查看一下当前装好的gcc包可以看到有gcc 11和9。 dpkg -l | grep gcc
ii gcc 4:11.2.0-1ubuntu1 amd64 GNU C compiler
ii gcc-11 11.4.0-1ubuntu1~22.04 amd64 GNU C compiler
ii gcc-11-base:amd64 11.4.0-1ubuntu1~22.04 amd64 GCC, the GNU Compiler Collection (base package)
ii gcc-12-base:amd64 12.3.0-1ubuntu1~22.04 amd64 GCC, the GNU Compiler Collection (base package)
ii gcc-9 9.5.0-1ubuntu1~22.04 amd64 GNU C compiler
ii gcc-9-base:amd64 9.5.0-1ubuntu1~22.04 amd64 GCC, the GNU Compiler Collection (base package)
ii lib32gcc-s1 12.3.0-1ubuntu1~22.04 amd64 GCC support library (32 bit Version)
ii libgcc-11-dev:amd64 11.4.0-1ubuntu1~22.04 amd64 GCC support library (development files)
ii libgcc-9-dev:amd64 9.5.0-1ubuntu1~22.04 amd64 GCC support library (development files)
ii libgcc-s1:amd64 12.3.0-1ubuntu1~22.04 amd64 GCC support library执行如下命令将gcc-9添加到update-alternatives工具中让我们可以通过config来切换gcc版本 sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-9 20 --slave /usr/bin/g g /usr/bin/g-9
update-alternatives: using /usr/bin/gcc-9 to provide /usr/bin/gcc (gcc) in auto mode使用如下命令查看可切换的gcc版本因为当前只给工具里添加了一个gcc-9版本所以会显示only one alternative即只有一个可选项的意思工具会认为没有啥好配置的。 sudo update-alternatives --config gcc
There is only one alternative in link group gcc (providing /usr/bin/gcc): /usr/bin/gcc-9
Nothing to configure.这时候我们可以把原本安装好的11.4版本的gcc也给添加到这个工具里面。优先级的数字可以根据你的情况自行调整
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此时就能看到两个版本的可选项了。 sudo update-alternatives --config gcc
There are 2 choices for the alternative gcc (providing /usr/bin/gcc).Selection Path Priority Status
------------------------------------------------------------
* 0 /usr/bin/gcc-9 20 auto mode1 /usr/bin/gcc-11 20 manual mode2 /usr/bin/gcc-9 20 manual modePress enter to keep the current choice[*], or type selection number:键入序号来选择你需要切换的gcc版本回车即可 gcc --version
gcc (Ubuntu 9.5.0-1ubuntu1~22.04) 9.5.0
Copyright (C) 2019 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已经被换成了9.5版本的了切换成功而且因为我们通过--slave配置了g命令的替换操作所以g的版本也跟着一起替换成9.5了 g --version
g (Ubuntu 9.5.0-1ubuntu1~22.04) 9.5.0
Copyright (C) 2019 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 11版本是相同的操作这里不再赘述。
添加多个slave
和gcc捆绑的还有一个用于分支覆盖率检测的gcov命令我们同样可以通过--slave选项将其绑定到版本中让gcov的命令版本也会更着gcc版本一同切换 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: 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版本是一致的不会出现不一致导致的兼容性问题。 gcov --version
gcov (Ubuntu 9.5.0-1ubuntu1~22.04) 9.5.0
Copyright (C) 2019 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版本
如果需要从这个工具中删除某个版本执行如下命令
sudo update-alternatives --remove gcc /usr/bin/gcc-9 删除后就无法通过该工具切换gcc版本为9了。