如何在Ubuntu上使用最新的GCC?

我想用最新版本的gcc编译我的程序。

Ubuntu 14.04自带的是gcc 4.8.2,但是现在有4.9.0可用,而且我看到它作为一个软件包可供下载:gcc-4.9。我尝试安装了一下。

sudo apt-get install gcc-4.9

但它说
Reading package lists... Done
Building dependency tree       
Reading state information... Done
Note, selecting 'gcc-4.9-base' for regex 'gcc-4.9'
gcc-4.9-base is already the newest version.
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.

看起来它已经安装好了,只是不是默认的?我该如何利用它来构建我的程序呢?

如果你想安装 gcc-4.8,你需要使用 sudo apt-get install gcc-4.8gcc-4.9gcc-4.8gcc-4.7gcc-4.6 都在Ubuntu主仓库中。 - user224082
1@Dumindu 但是我要如何专门使用 gcc-4.9 呢? - Nickolai Leschov
卸载其他版本并安装4.9版。 - user224082
2@Dumindu 等一下,你剛才是不是讓我做我已經做過的事情?這行不通。 - Nickolai Leschov
切换到root用户:sudo su - 进入/usr/bin目录,然后运行ls -l gcc*并将输出发布。然后我会回复你的答案。 - αғsнιη
5个回答

正确安装gcc-4.9并将其设为默认gcc版本的最佳方法是使用:
sudo add-apt-repository ppa:ubuntu-toolchain-r/test
sudo apt-get update
sudo apt-get install gcc-4.9 g++-4.9
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.9 60 --slave /usr/bin/g++ g++ /usr/bin/g++-4.9

使用--slave选项,配合g++命令,可以使得g++gcc同时切换到相同的版本。但是,在这个时候,update-alternatives中只配置了gcc-4.9这一个版本,所以需要将4.8添加到update-alternatives中,这样才会有一个可供选择的备选版本。具体操作如下:
sudo apt-get install gcc-4.8 g++-4.8
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.8 60 --slave /usr/bin/g++ g++ /usr/bin/g++-4.8

然后你可以检查设置的是哪一个,并使用以下方法来回切换:
sudo update-alternatives --config gcc

如果您在使用update-alternatives gcc优先级60时发现它不比之前安装的版本更高,您可以使用之前的update-alternatives --config gcc命令来检查已安装的版本并使用。
sudo update-alternatives --remove gcc

或者:

sudo update-alternatives --remove-all gcc

注意:您可以跳过安装PPA存储库,直接使用/usr/bin/gcc-4.9-base,但我更喜欢使用更新的工具链。
对于GCC 5.X或6,软件包(以及相应的命令)只被称为gcc-5,gcc-6等。这是由于GCC版本方案的变化所致,其中5.1是第一个GCC 5发布版本,而未来的5.X版本用于修复错误

感谢编辑 @muru...就像我下面说的那样,我已经连续三天没休息了,非常疲惫,update-alternatives需要sudo,我想我忘记了(-- )写在slave之前。:)所以,谢谢你。 - SudoSURoot
尝试 sudo apt-get -f install - SudoSURoot
4这个完美运作。另外,将4.9替换为5以在Ubuntu上使GCC 5正常工作。(我的开发团队现在按照您的方法同时运行4.9和5版本。)谢谢,并点赞! - CodeMouse92
嘿muru:那拯救了我的生命!非常、非常感谢你! - apos
我在命令中将gcc-4.9替换为gcc-5,但最终的gcc -v仍然显示4.x版本。还有其他人遇到过这个问题吗? - benjaminz
它适用于gcc-5,但对于gcc-6则不行。对于gcc-6,它抱怨找不到该软件包。 - Moj
2@hwat 现在应该适用于 gcc-6 - edwinksl
1这对我有过帮助,但我总是忘记——确保将相同的解决方案应用于你可能使用的GNU编译器集合中的其他实用程序!例如,如果不这样做,GCOV可能会抱怨版本不匹配,从而可能产生错误的数据。 - Toby
需要这个帮助来安装CLFS并使用16.10作为主机系统。在16.10中使用6.2.0版本太新了,会导致构建失败。 - eyoung100
挽救了局面 - Arpit Solanki
为什么Linux发行版仍然使用GCC 4.9?为什么它们不更新到GCC 7.x分支呢? - Royi
完整的命令列表可在https://gist.github.com/application2000/73fd6f4bf1be6600a2cf9f56315a2d91上找到,其中包括配置`update-alternatives`。 - WillC
1已确认适用于gcc-10。 - Sterls
我可以建议编辑一下,解释一下/gcc.(version)文件后面的随机数字60的含义吗?我在这里找到了一个答案链接。在我的情况下,60不起作用,因为其他版本是90 - Elliott
60是优先级。之所以对你不起作用,很可能是因为你已经设置了另一个版本的gcc作为你的备选项,并且它的优先级更高。我不认为更高的优先级适用于每个人。我现在没有时间来做这个,但我可以添加一个更新备选项的命令来移除所有关于gcc的内容。 - SudoSURoot
我在检查和移除较旧版本的gcc以解决优先级问题方面添加了一些信息。 - SudoSURoot
如果我运行你的"update-alternatives"命令,我会得到这个错误:update-alternatives: error: no alternatives for gcc,尽管我已经安装了gcc-12和gcc-11。 - Raleigh L.
确保您拥有正确的gcc和g++文件位置和名称。使用which gccwhich g++来查找位置。 例如: sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-12.2 60 --slave /usr/bin/g++ g++ /usr/bin/g++-12.2 - SudoSURoot

终极超级大兼容性表

好的,我们开始吧:

               GCC                clang
        +----------------------+-----------------------------+
        | 12 11 10 9 8 7 6 5 4 | 15 14 13 12 11 10 9 8 7 6 5 |
+-------+----------------------+-----------------------------+
| 23.04 |  D  M  M M           |  D  M  M                    |
| 22.10 |  D  M  M M           |  D  M  M                    |
| 22.04 |  M  D  M M           |     D  M  M  M              |
| 21.10 |     D  M M M         |        D  M  M  M M         |
| 21.04 |     M  D M M M       |           D  M  M M         |
| 20.10 |        D M M M       |              D  M M M M M   |
| 20.04 |        P D M M       |                 D M M M M   |
| 19.10 |          D M M       |                             |
| 19.04 |          M D M M     |                             |
| 18.10 |            D M M M   |                             |
| 18.04 |        P P M D M M   |                   M M M D M |
| 16.04 |          P P P P D M |                             |
+-------+----------------------+-----------------------------+
表格上的空白表示“没有可用的软件包”或者“我没去检查”。值得注意的是,我对PPA软件包的研究并不太深入。欢迎修改。
所有问题如下:
- 在Ubuntu 18.04上安装gcc-9? - 如何安装gcc-7或clang 4.0? - 在Ubuntu 18.04上安装gcc-9? - 在Ubuntu 18.04中有哪些GCC和clang版本可用? 如何将非默认的GCC设置为默认版本?

例如,您安装了/usr/bin/gcc-7,但在运行gcc main.c时希望使用该安装而不是/usr/bin/gcc

使用其他答案中提到的sudo update-alternatives命令:https://askubuntu.com/a/581497/52975 它会为您创建所需的符号链接。

另请参阅:“update-alternatives”到底是做什么的?

如何从源代码构建自己的工具链

如果即使PPA也不满足您的要求,请参阅以下内容:

旧版GCC相关问题


如果我只想安装一个编译器版本怎么办?如何删除旧版本?其他人建议的 update-alternatives 命令是做什么用的,为什么你的回答里没有提到它? - Noone AtAll
为什么有关于Ubuntu 18.10和GCC 9的漏洞呢?它们不被支持吗? - Noone AtAll
update-alternatives命令在/usr/bin/gcc和您选择的GCC之间创建符号链接。如果您想将gcc设置为非默认的GCC,建议与此答案一起使用:https://askubuntu.com/questions/233190/what-exactly-does-update-alternatives-do 如果通过上述方法无法实现,则表示不支持该情况。值得注意的是,PPA似乎只支持Ubuntu的LTS版本。除了最新版本,我不建议使用非LTS版本的Ubuntu。 - Ciro Santilli OurBigBook.com
那么,我的旧电脑上的Lubuntu 16.04无法运行最新的g++(g++-11)吗?完全没有办法吗? - Chameleon
1@Chameleon 要么从源代码构建,要么尝试找到另一个 PPA。 - Ciro Santilli OurBigBook.com
有没有更新gcc-12的机会? - user7761803
1@user7761803,目前官方的Ubuntu PPA还没有这个软件:https://launchpad.net/~ubuntu-toolchain-r/+archive/ubuntu/test,所以你要么从源代码编译(参考例如:https://stackoverflow.com/questions/21872229/how-to-edit-and-re-build-the-gcc-libstdc-c-standard-library-source/51946224#51946224),要么找其他的PPA。 - Ciro Santilli OurBigBook.com
请更新gcc-13。我可以在这个答案的链接(https://launchpad.net/~ubuntu-toolchain-r/+archive/ubuntu/test/+packages)上看到这个软件包,但无法在Ubuntu 22.04上安装它。 更新:看起来我必须升级到23.04才能安装。 - 4LegsDrivenCat
1@4LegsDrivenCat 是的。而且似乎GCC 13还没有发布:https://www.phoronix.com/news/GCC-13-Ends-Stage-1-Development 在回答中加入之前,我们最好等一下。如果你需要它,最好的方法是根据“如何从源代码构建自己的工具链”进行编译。 - Ciro Santilli OurBigBook.com

使用Toolchain Test Builds PPA
sudo add-apt-repository ppa:ubuntu-toolchain-r/test
sudo apt-get update
sudo apt-get install gcc-4.9

我不认为GCC 4.9在Ubuntu 14.04上完全可用。基础包(gcc-4.9-base)和GCC Go 4.9编译器(gccgo-4.9)是可用的,但其他前端不可用。我不知道为什么。

1@SudoSURoot 可能设置为默认,这不是我的关注点(有其他帖子在处理这个问题)。然而,GCC 4.9的C和C++前端纯粹可以从官方仓库安装在14.04上这一说法显然是错误的,因为gcc-4.9-base软件包不包含二进制前端。 - muru
关于基本套餐,你是正确的。正如你在我的回答中所看到的,我使用了PPA。我先发表了评论,然后按照问题所述回答了问题...因为仅仅添加PPA并安装4.9版本并不能启用它,而这是“使用gcc 4.9”所需要的。我应该在回答问题后删除评论。对此我表示道歉。应该把重点放在我的回答上。我过于草率地下结论并且评论得太快了。实际上,我对使用14.04还是相当新手,因为我刚刚获得了专用服务器。我会确保自己没有投反对票,如果有的话,我会修复它。 - SudoSURoot
@SudoSURoot 好的。尽管如此,除非 OP 对于调用 gcc-4.9g++-4.9 而不是 gccg++ 有问题,否则我将坚持不更新替代方案。 - muru
我完全理解。虽然我构建Android系统,但它使用了很多$(which gcc)和$(which g++)等等...所以我总是需要将默认设置为我想要使用的版本。我的一些内核代码无法使用主机gcc-4.8编译,所以我不得不进行更新。我只是重复了对我有效的方法。谢谢你提醒我...就像我在上一条评论中所说的那样,如果我投票反对是过早的话,我会修正的。当我发表这些评论时,我已经连续工作了2到3天的内核源码。每个人都有自己的方式...我只是发现我的回答越详细,问题就越少。 - SudoSURoot
最新的软件包是gcc-7 ATM。 - Elder Geek

Ubuntu 16.04及更高版本

您可以从默认软件源中直接安装gcc 7.0在Ubuntu 18.04上。要在Ubuntu 17.10、18.04和18.10上安装gcc-7,请打开终端并输入以下命令:

sudo apt install gcc-7 

在Ubuntu 18.04及更高版本中安装gcc-8,打开终端并输入以下命令:
sudo apt install gcc-8

在Ubuntu 19.04及更高版本中安装gcc-9,打开终端并输入以下命令:
sudo apt install gcc-9

你可以从ppa:jonathonf/gcc-7.1在Ubuntu 16.04上安装gcc-7。
sudo add-apt-repository ppa:jonathonf/gcc-7.1  
sudo apt update  
sudo apt install gcc-7  

你可以从ppa:jonathonf/gcc-8.0在Ubuntu 16.04上安装gcc-8。
sudo add-apt-repository ppa:jonathonf/gcc-8.0  
sudo apt update  
sudo apt install gcc-8  

可以同时安装多个版本的gcc。您可以使用update-alternatives命令更改默认的gcc版本,以确定由通用名称引用的实际文件,例如由gcc引用的实际文件。有关更多信息,请参阅此问题的答案:如何在Ubuntu中更改默认的GCC编译器?

要调用特定的gcc 4.9版本,请在命令提示符下使用gcc-4.9

您安装的所有gcc版本都可以通过在gcc后面加上连字符和版本号来单独调用。在您的情况下,gcc-4.8gcc-4.9应该可用。在终端中,键入gcc-(注意连字符)并按两次Tab键查看是否存在其他版本。

请注意,默认的gcc版本可能仍然是4.8。(使用gcc -v验证此信息。)如果您从默认软件源安装了gcc-4.9,则更改默认版本并不容易,因为它没有添加update-alternatives条目。如果您想了解如何更改默认版本,请参阅对这个问题的回答。


如何在依赖于makefile和其他构建基础设施的项目中,将构建工具从gcc更改为gcc-4.9 - Nickolai Leschov
1确保在构建系统中使用gcc-4.9的最佳方法是更改默认的gcc。请参考我在答案中提供的链接了解如何进行此操作。或者,您可以创建一个符号链接,不过我建议只在万不得已时使用此方法,因为在更新gcc时包管理器可能会出现问题。如果您坚持要这样做:sudo rm /usr/bin/gcc; sudo ln -s /usr/bin/gcc-4.9 /usr/bin/gcc。要恢复到默认的gcc-4.8,请将gcc-4.9替换为gcc-4.8。您可能还需要对g++和其他GNU编译器进行类似操作。 - holocronweaver
GCC 4.9在Ubuntu 14.04中不可用(除了GCC Go编译器),所以尽管这个答案可能适用于Ubuntu 14.10,但现在并没有帮助。 :-) - Søren Løvborg
实际上,在Ubuntu 14.04中是可用的,尽管可能是一个错误:http://packages.ubuntu.com/trusty/gcc-4.9-base。我从四月份开始就一直在使用它。 - holocronweaver