Linux系统中多版本GCC管理与切换

Linux系统中,通常会拥有预装的GCC版本,但是预装的版本通常会更看重稳定性,在实际项目中,可能会需要一些新特性,这时候需要手动安装更新的编译器版本。可以看到,在当前的Ubuntu 22.04系统中,已经安装了gcc-11和gcc-13两个版本的编译器,默认的gcc版本是仍然是预装的gcc-11。

12345678910111213141516171819~ ❯❯❯ gcc --versiongcc (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0Copyright (C) 2021 Free Software Foundation, Inc.This is free software; see the source for copying conditions. There is NOwarranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.~ ❯❯❯ ll /usr/bin/gcc*lrwxrwxrwx 1 root root 6 Aug 5 2021 /usr/bin/gcc -> gcc-11lrwxrwxrwx 1 root root 23 May 13 2023 /usr/bin/gcc-11 -> x86_64-linux-gnu-gcc-11lrwxrwxrwx 1 root root 23 Jul 11 2023 /usr/bin/gcc-13 -> x86_64-linux-gnu-gcc-13lrwxrwxrwx 1 root root 9 Aug 5 2021 /usr/bin/gcc-ar -> gcc-ar-11lrwxrwxrwx 1 root root 26 May 13 2023 /usr/bin/gcc-ar-11 -> x86_64-linux-gnu-gcc-ar-11lrwxrwxrwx 1 root root 26 Jul 11 2023 /usr/bin/gcc-ar-13 -> x86_64-linux-gnu-gcc-ar-13lrwxrwxrwx 1 root root 9 Aug 5 2021 /usr/bin/gcc-nm -> gcc-nm-11lrwxrwxrwx 1 root root 26 May 13 2023 /usr/bin/gcc-nm-11 -> x86_64-linux-gnu-gcc-nm-11lrwxrwxrwx 1 root root 26 Jul 11 2023 /usr/bin/gcc-nm-13 -> x86_64-linux-gnu-gcc-nm-13lrwxrwxrwx 1 root root 13 Aug 5 2021 /usr/bin/gcc-ranlib -> gcc-ranlib-11lrwxrwxrwx 1 root root 30 May 13 2023 /usr/bin/gcc-ranlib-11 -> x86_64-linux-gnu-gcc-ranlib-11lrwxrwxrwx 1 root root 30 Jul 11 2023 /usr/bin/gcc-ranlib-13 -> x86_64-linux-gnu-gcc-ranlib-13

在这里可以通过update-alternatives命令来设置默认的gcc版本。可以通过--install参数来添加新的版本,或者通过--config参数来选择当前的默认版本,并且这里通过--slave参数来设置g++和gcov的版本。

12~ ❯❯❯ sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-11 11 --slave /usr/bin/g++ g++ /usr/bin/g++-11 --slave /usr/bin/gcov gcov /usr/bin/gcov-11~ ❯❯❯ sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-13 13 --slave /usr/bin/g++ g++ /usr/bin/g++-13 --slave /usr/bin/gcov gcov /usr/bin/gcov-13

可以发现,命令执行完成后,/usr/bin/gcc的软链接指向了/etc/alternatives/gcc,检查版本之后可以发现,当前的gcc版本已经变成了gcc-13,而g++的版本也进行了相应的更新。

123456789101112131415161718192021222324252627282930~ ❯❯❯ gcc --versiongcc (Ubuntu 13.1.0-8ubuntu1~22.04) 13.1.0Copyright (C) 2023 Free Software Foundation, Inc.This is free software; see the source for copying conditions. There is NOwarranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.~ ❯❯❯ g++ --versiong++ (Ubuntu 13.1.0-8ubuntu1~22.04) 13.1.0Copyright (C) 2023 Free Software Foundation, Inc.This is free software; see the source for copying conditions. There is NOwarranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.~ ❯❯❯ ll /usr/bin/gcc*lrwxrwxrwx 1 root root 21 Apr 22 16:09 /usr/bin/gcc -> /etc/alternatives/gcclrwxrwxrwx 1 root root 23 May 13 2023 /usr/bin/gcc-11 -> x86_64-linux-gnu-gcc-11lrwxrwxrwx 1 root root 23 Jul 11 2023 /usr/bin/gcc-13 -> x86_64-linux-gnu-gcc-13lrwxrwxrwx 1 root root 9 Aug 5 2021 /usr/bin/gcc-ar -> gcc-ar-11lrwxrwxrwx 1 root root 26 May 13 2023 /usr/bin/gcc-ar-11 -> x86_64-linux-gnu-gcc-ar-11lrwxrwxrwx 1 root root 26 Jul 11 2023 /usr/bin/gcc-ar-13 -> x86_64-linux-gnu-gcc-ar-13lrwxrwxrwx 1 root root 9 Aug 5 2021 /usr/bin/gcc-nm -> gcc-nm-11lrwxrwxrwx 1 root root 26 May 13 2023 /usr/bin/gcc-nm-11 -> x86_64-linux-gnu-gcc-nm-11lrwxrwxrwx 1 root root 26 Jul 11 2023 /usr/bin/gcc-nm-13 -> x86_64-linux-gnu-gcc-nm-13lrwxrwxrwx 1 root root 13 Aug 5 2021 /usr/bin/gcc-ranlib -> gcc-ranlib-11lrwxrwxrwx 1 root root 30 May 13 2023 /usr/bin/gcc-ranlib-11 -> x86_64-linux-gnu-gcc-ranlib-11lrwxrwxrwx 1 root root 30 Jul 11 2023 /usr/bin/gcc-ranlib-13 -> x86_64-linux-gnu-gcc-ranlib-13~ ❯❯❯ ll /usr/bin/g++*lrwxrwxrwx 1 root root 21 Apr 22 16:09 /usr/bin/g++ -> /etc/alternatives/g++lrwxrwxrwx 1 root root 23 May 13 2023 /usr/bin/g++-11 -> x86_64-linux-gnu-g++-11lrwxrwxrwx 1 root root 23 Jul 11 2023 /usr/bin/g++-13 -> x86_64-linux-gnu-g++-13

通过--config参数可以查看当前拥有的所有gcc版本,并且可以简单地通过数字来选择需要的版本。

12345678910~ ❯❯❯ update-alternatives --config gccThere are 2 choices for the alternative gcc (providing /usr/bin/gcc). Selection Path Priority Status------------------------------------------------------------* 0 /usr/bin/gcc-13 13 auto mode 1 /usr/bin/gcc-11 11 manual mode 2 /usr/bin/gcc-13 13 manual modePress to keep the current choice[*], or type selection number: