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了

显然这样手动切换版本是麻烦的,每次都要执行几条命令才能达到目的。
使用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
并根据提示选择自己需要的版本即可。

实际上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