我的技术博客

分享计算机科学与技术的学习笔记和实践经验

Linux系统中管理多版本gcc/g++

在Linux系统中经常使用gcc/g++编译安装源码包,但是不同的项目可能依赖不同的gcc/g++版本。频繁的卸载重装不同版本的gcc/g++又过于繁琐,所以使用update-alternatives命令来管理gcc/g++的多个版本吧。

安装多个版本的gcc/g++

Linux系统可以同时安装多个不同版本的gcc/g++(以ubuntu为例),实际上ubuntu源里也同时包含多个版本的gcc/g++

安装gcc/g++ 6.x

sudo apt install gcc-6 g++-6

安装gcc/g++ 7.x

sudo apt install gcc-7 g++-7

安装gcc/g++ 8.x

sudo apt install gcc-8 g++-8

提示:在Ubuntu18.04中如果想安装gcc/g++ 9.x或者更新的版本则需要添加Ubuntu Toolchain PPA源了。

手动切换默认版本

在使用update-alternatives进行管理之前,先尝试手动切换gcc/g++版本以探究其原理。显然默认使用哪一个版本的gcc/g++由/usr/bin/gcc和/usr/bin/g++决定,这两个文件为软链接文件,其指向哪一个gcc/g++版本的可执行文件默认使用就是哪一个版本的gcc/g++,因此只需要改变其链接的可执行文件即可达到设置默认gcc/g++的目的,例如我想使用gcc/g++ 6.x作为默认版本,只需要删除原来的/usr/bin/gcc和/usr/bin/g++

sudo rm /usr/bin/gcc /usr/bin/g++

再重新生成这两个软链接文件使其分别指向/usr/bin/gcc-6和/usr/bin/g++-6

sudo ln -s /usr/bin/gcc-6 /usr/bin/gcc
sudo ln -s /usr/bin/g++-6 /usr/bin/g++

提示:软链接创建命令 ln -s 源文件 软链接文件

之后再查看gcc和g++版本就可以发现已经切换到6.x了

gcc版本信息

显然这样手动切换版本是麻烦的,每次都要执行几条命令才能达到目的。

使用update-alternatives快速切换版本

update-alternatives是ubuntu系统中专门维护系统命令链接符的工具,通过它可以很方便的设置系统默认使用哪个命令、哪个软件版本。假设已经安装好了gcc/g++ 6.x 7.x 8.x三个版本,要使用update-alternatives快速在它们之间切换默认版本首先要将这三个版本添加到update-alternatives中,执行

sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-6 60 --slave /usr/bin/g++ g++ /usr/bin/g++-6
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-7 70 --slave /usr/bin/g++ g++ /usr/bin/g++-7
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-8 80 --slave /usr/bin/g++ g++ /usr/bin/g++-8

特别注意命令中那个数字,代表不同版本之间的优先级,在自动模式下优先级最高的即为默认版本。我这里6.x 7.x 8.x 优先级分别为60 70 80 所以默认版本是8.x。

添加到update-alternatives之后事情就简单了,当我们需要切换版本时只需要执行

sudo update-alternatives --config gcc

并根据提示选择自己需要的版本即可。

alternatives配置界面

实际上update-alternatives可以用于需要不同版本软件的多种场合,比如系统同时安装了open-jdk和sun-jdk的情况下使用update-alternatives就可以随时切换到想要的jdk版本了,再比如系统同时安装了python2和python3我们有时希望python命令指向python2有时希望python命令指向python3也可以用update-alternatives进行切换。

最后附上update-alternatives的manpage:http://manpages.ubuntu.com/manpages/trusty/man8/update-alternatives.8.html