Ubuntu 20.04 LTS(至少是核心 docker 映像)随 libgcc-s1 和 gcc-10-base 版本 10.3.0(-1ubuntu1~20.04)一起分发,例如,请参阅清单https://partner-images.canonical.com/core/focal/20211103/ubuntu-focal-core-cloudimg-amd64.manifest。
20.04 LTS 中的 GCC 默认版本是 GCC 9,而不是 GCC 10。
这种明显差异的原因是什么? - 为什么不分发这些软件包的 9.x 版本?这与 20.04LTS 中用于编译基于 C 的软件包的 GCC 版本有关吗?20.04 LTS 的大多数(所有?)基于 C 的软件包都是用 GCC 10 编译的吗?
答案1
免责声明:我对 Ubuntu 还很陌生。我对 RHEL 和 SLES 有相当多的经验,最近因为某些 ARM64 硬件不想启动任何其他东西,不得不学习 Ubuntu LTS 版本。
概括
Ubuntu 版本确实经常会附带一些来自比版本默认 GCC 更高版本的 GCC 的组件。他们这样做显然是为了能够提供更高版本的编译器,如果你想使用它们。
- gcc-10-base 包仅提供文档。
- libgcc-s1 包提供了一个重要的库
libgcc_s.so.1
。它为编译器生成的代码提供了辅助函数:我知道它对于处理通过 C 调用堆栈抛出的 C++ 异常非常重要。 - 另一个重要的库是
libstdc++.so.6
。它提供 C++ 支持函数。 - Glibc(
libc.so.6
和libm.so.6
其他库)也很重要,但与 GCC 版本无关。
所有这些库都有非常严格的兼容性规则。本质上,库的较新版本将始终与较早版本兼容,GCC 和 Linux 早期历史中的一些古老版本除外。
一开始并不明显为什么 Ubuntu 和 Debian 提供比编译器更晚的运行时间,但是当你查看最近的 Ubuntu LTS 版本上可用的 GCC 版本范围时,它会变得更加清晰:
Distribution Released Debian GCC run-times Default GCC Additional GCCs
Ubuntu 16.04 Apr 2016 9.x 5.x 5.4 4.7, 4.8, 4.9
Ubuntu 18.04 Apr 2018 10.x 8.x 7.5 4.8, 5.5, 6.5. 8.4
Ubuntu 20.04 Apr 2020 11.x 9.x & 10.x 9.3 7.4, 8.4, 10.3
Ubuntu 22.04 Apr 2022 12.x 12.x 11.4 9.5, 10.5, 12.3
此时,它变得相当明显。Ubuntu 20.04 具有使用 GCC 9.x 和 10.x 编译的代码的运行时(GCC 10.x 不需要 GCC 9.x 未使用的任何额外库函数)。您可以安装 GCC 7.4、8.4 和 10.3 的任意组合作为额外的编译器,它们都可以工作。Ubuntu 20.04 上的运行时库将支持使用其中任何一种编译器编译的代码。
为什么不将 GCC 10.3 与 Ubuntu 20.04 一起发布?运行时库通常比编译器更稳定。GCC 10 应该在 20.04 组装时首次发布(作为 10.1)。使用全新的编译器构建 LTS 版本是愚蠢的;在使用 GCC 9 构建的代码测试新运行时库后再发布新运行时库要安全得多,并且允许在 GCC 10 稳定后添加。
Canonical 没有为 20.04 提供 GCC 11,因为它没有必要的运行时。对于这些,您需要更高版本的 Ubuntu。
如何找出所有这些内容
/usr/share/doc/gcc/README.Debian
有一些信息。
dpkg-query --listfiles gcc-10-base
向我们展示了 gcc-10-base 仅提供文档。
dpkg-query --listfiles libgcc-s1
向我们展示了 libgcc-s1 提供的/lib/x86_64-linux-gnu/libgcc_s.so.1
,它是 GCC 的基本运行时库之一。
C/C++ 的其他基本运行时库是独立于 GCC 的 glibc 和 libstdc++。dpkg-query -list | grep libstdc
向我们展示了两个包:
ii libstdc++-9-dev:amd64 9.3.0-17ubuntu1~20.04 amd64 GNU Standard C++ Library v3 ...
ii libstdc++6:amd64 10.3.0-1ubuntu1~20.04 amd64 GNU Standard C++ Library v3
libstdc++6
是GCC 10.3版本;-dev
软件包是GCC 9.3版本。
dpkg-query --listfiles libstdc++-9-dev
向我们展示了该软件包提供了使用 GCC 9 在 C++ 中进行开发的头文件、档案库和文档。
dpkg-query --listfiles libstdc++6
向我们展示了这个包提供了文档、一些 Python 脚本和两个非常重要的文件:
/usr/lib/x86_64-linux-gnu/libstdc++.so.6
/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.28
该.so.6
文件是程序所链接的对象。它实际上是指向该.so.6.028
文件的软链接。这是 libstdc++(C++ 的 GCC 支持库)的 GCC 10 版本的名称。您可以获取这些名称与 GCC 版本之间的映射这里。向下滚动,你会发现一些表格。
用于构建 Ubuntu 的 GCC
最容易检查的是 glibc。使用与操作系统其他部分不同的编译器来构建它会很疯狂,你只需询问一下就可以找出使用哪个编译器来构建它:
/usr/lib/x86_64-linux-gnu/libc.so.6
GNU C 库 (Ubuntu GLIBC 2.31-0ubuntu9.7) 稳定版本 2.31。
版权所有 (C) 2020 Free Software Foundation, Inc.
这是免费软件;请参阅来源了解复制条件。
没有任何保证;甚至对于适销性或
特定用途的适用性也不提供保证。
由 GNU CC 版本 9.3.0 编译。libc
ABIs:UNIQUE IFUNC ABSOLUTE
有关错误报告说明,请参阅:
https://bugs.launchpad.net/ubuntu/+source/glibc/+bugs。