英文:
Update GCC on Ubuntu
问题
我正在进行一个需要GCC 10.x或更高版本的项目。
目前我在Ubuntu 20.04.1上安装的是GCC 9.4.0。我尝试更新编译器,但未成功。
有人可以给我升级的建议吗?
我在gcc网站上看到,版本9.4比一些10.x版本更为最新。GCC的结构是怎样的?
此外,我尝试了以下操作:
sudo apt-get install gcc-10.2 g++-10.2
但最终我的GCC版本仍然是9.4。
gcc (Ubuntu 9.4.0-1ubuntu1~20.04.1) 9.4.0
英文:
I am on a project that needs GCC 10.x or later.
At this time I have GCC 9.4.0 on Ubuntu 20.04.1. I tried to update the compiler, but it does not work.
Can anybody give me an advice for the update?
I read on the gcc website that version 9.4 is more up-to-date than some 10.x versions. How is Gcc structured?
among other things I tried:
sudo apt-get install gcc-10.2 g++-10.2
but after all my gcc version is still 9.4
gcc (Ubuntu 9.4.0-1ubuntu1~20.04.1) 9.4.0
答案1
得分: 5
这是Linux中的一个常见模式。当同一个程序的多个版本安装时,尽管可执行文件都存在于/usr/bin/目录中,但只有一个版本被视为该程序。例如,如果安装了gcc-9和gcc-10,两个可执行文件都存在,分别为/usr/bin/gcc-9和/usr/bin/gcc-10,但只有一个版本会被视为gcc。这是通过在/usr/bin/gcc的目录中创建符号链接来实现的。在Ubuntu 20.04中,首选版本是gcc-9,因此将gcc-9创建为gcc的符号链接。
您可以通过运行以下命令来检查这一点。
$ which gcc | xargs file
输出将会是
/usr/bin/gcc: symbolic link to gcc-9
有几种方法可以将gcc-10用作C编译器。
-
直接调用
gcc-10可执行文件。而不是使用gcc <code.c>,调用gcc-10 <code.c>。 -
您可以手动创建
gcc-10作为首选的gcc符号链接。假设您没有修改系统路径,可以使用以下命令。
# ln -s /usr/bin/gcc-10 /usr/local/bin/gcc
这是因为默认情况下,/usr/local/bin/中的可执行文件优先于/usr/bin/。
- 如果您使用bash,您可以在您的
.bashrc文件中创建一个名为gcc的别名,将其指向gcc-10。添加以下行到您的.bashrc文件中。
alias gcc="gcc-10"
请记住重新启动bash或运行source ~/.bashrc。
- 使用
update-alternatives(感谢@ted-lyngmo指出这一点)。基于Debian的发行版提供了一个单独的程序,可以更轻松地进行符号链接或更多功能的设置。使用man update-alternatives可以了解更多信息。要将gcc-10设置为首选的gcc,使用以下命令。
# update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-10 60
上述命令表示,/usr/bin/gcc是需要的link,名称是gcc,目标可执行文件是/usr/bin/gcc-10,优先级为60。
这将gcc链接到/etc/alternatives/gcc,它本身是一个指向/usr/bin/gcc-10的符号链接。如果添加了优先级更高的程序到update-alternatives中,/etc/alternatives/gcc将指向较高优先级的程序。
如果没有特殊原因,我建议升级到更新的Ubuntu版本,以便默认的gcc是更新的版本。
我在gcc的官方网站上看到,版本9.4比一些10.x版本更为更新。
新版本的gcc会增加新功能。还会添加对新的C/C++标准的支持。例如,您可以在这里阅读gcc-10的更改内容here。但是,一些程序仍然需要gcc-9,因为只有使用gcc-9才能构建这些程序。因此,GNU会长时间维护gcc-9(以及更旧的版本)。会修复bug并发布更新版本。这可能会在发布了新的gcc版本后发生。因此,gcc-9的某个版本可能比gcc-10的某个版本更新。
英文:
This is a common pattern in linux. When there are multiple versions of the same program installed, though the executables are all present in the /usr/bin/ directory, only one of them is "visible" as that program. For example, if you install gcc-9 and gcc-10, both executables are present as /usr/bin/gcc-9 and /usr/bin/gcc-10 but only one of them is visible as gcc. This happens by symlinking a preferred version to the same directory as /usr/bin/gcc. In ubuntu 20.04, the preferred version is gcc-9 and so, gcc-9 is symlinked as gcc.
You can check this by running the following command.
$ which gcc | xargs file
The output will be
/usr/bin/gcc: symbolic link to gcc-9
There are a few things you can do to use gcc-10 as your c compiler.
- Directly call the
gcc-10executable. Instead of usinggcc <code.c>, callgcc-10 <code.c>. - You can manually symlink
gcc-10as the preferredgcc. Assuming you did not modify the system paths, the following command can be used.
# ln -s /usr/bin/gcc-10 /usr/local/bin/gcc
This works because, by default, the executables in /usr/local/bin/ take precedence over /usr/bin/.
- If you are using bash, you can create an alias for
gccasgcc-10. Add the following line to your.bashrc.
alias gcc="gcc-10"
Remember to relaunch bash or source ~/.bashrc.
- Using
update-alternatives(Thanks to @ted-lyngmo for pointing it out). Debian based distributions supply a separate program, that can make symlinking easier / more functional. Read more usingman update-alternatives. To usegcc-10as the preferredgcc, use the following command.
# update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-10 60
The above command says, /usr/bin/gcc is the link needed and the name is gcc, the target executable is /usr/bin/gcc-10 and it has a priority of 60.
This links gcc to /etc/alternatives/gcc, which itself is a symlink to /usr/bin/gcc-10. If a higher priority program is added to update-alternatives, /etc/alternatives/gcc points to the higher priority program.
If you don't have any specific reason, I would also recommend to upgrade to a newer ubuntu version, so that the default gcc is a newer one.
> I read on the gcc website that version 9.4 is more up-to-date than some 10.x versions.
With newer gcc versions, new features are added. Support for newer c/c++ standards are also added. Eg. You can read the changes for gcc-10 here. But people still need gcc-9 because some programs only build with gcc-9. So, GNU maintains gcc-9 (and much older versions) for a long time. Bugs are fixed, and newer releases are made. This can happen after the release of a newer gcc version. So, it is very much possible that a version of gcc-9 is newer than a version of gcc-10.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。


评论