Отказ от ответственности: я новичок в Ubuntu. У меня есть достаточный опыт работы с RHEL и SLES, и недавно мне пришлось изучать версии Ubuntu LTS из-за некоторого оборудования ARM64, которое не хочет загружать что-либо еще.
Резюме
Релизы Ubuntu действительно часто поставляются с некоторыми компонентами из более позднего GCC, чем GCC по умолчанию для релизов. Очевидно, они делают это для того, чтобы предоставить более поздние версии компилятора, если вы хотите их использовать.
- Пакет gcc-10-base просто предоставляет документацию.
- Пакет libgcc-s1 содержит важную библиотеку,
libgcc_s.so.1
. Это обеспечивает вспомогательные функции для кода, сгенерированного компилятором: я знаю, что это важно для обработки исключений C++, выбрасываемых через стек вызовов C.
- Еще одна важная библиотека
libstdc++.so.6
. Это обеспечивает функции поддержки C++.
- Глибк (
libc.so.6
, libm.so.6
и другие библиотеки) также важен, но не привязан к версии GCC.
Все эти библиотеки имеют очень строгие правила совместимости. По сути, более поздняя версия библиотеки всегда будет совместима с более ранними версиями, за исключением некоторых старых версий из ранней истории GCC и Linux.
Поначалу не очевидно, почему Ubuntu и Debian обеспечивают более позднее время выполнения, чем компилятор, но становится яснее, когда вы смотрите на диапазон версий GCC, доступных в последних версиях Ubuntu LTS:
Выпущенный дистрибутив Среды выполнения Debian GCC GCC по умолчанию Дополнительные GCC
Ubuntu 16.04, апрель 2016 г. 9.x 5.x 5.4 4.7, 4.8, 4.9
Ubuntu 18.04 апреля 2018 г. 10.x 8.x 7.5 4.8, 5.5, 6.5. 8.4
Ubuntu 20.04, апрель 2020 г. 11.x 9.x и 10.x 9.3 7.4, 8.4, 10.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 должен был быть впервые выпущен (как 10.1) примерно в то же время, когда собиралась версия 20.04. Было бы безрассудно создавать выпуск LTS с совершенно новым компилятором; доставка новых библиотек времени выполнения после их тестирования с кодом, созданным с помощью GCC 9, намного безопаснее и позволяет добавить GCC 10 после его стабилизации.
Canonical не предоставляет GCC 11 для 20.04, потому что у него нет необходимого времени выполнения. Для них вам нужна более поздняя версия Ubuntu.
Как узнать все это
/usr/share/doc/gcc/README.Debian
есть некоторая информация, а Ununtu 20.04 основан на Debian 11 «Bullseye».
dpkg-query --listfiles gcc-10-база
показывает нам, что gcc-10-base предоставляет только документацию.
dpkg-запрос --listfiles libgcc-s1
показывает нам, что libgcc-s1 предоставляет /lib/x86_64-linux-gnu/libgcc_s.so.1
, которая является одной из основных библиотек времени выполнения для GCC.
Другими базовыми библиотеками времени выполнения для C/C++ являются glibc, независимая от GCC, и libstdc++. dpkg-запрос-список | grep libstdc
показывает нам два пакета:
ii libstdc++-9-dev:amd64 9.3.0-17ubuntu1~20.04 amd64 Стандартная библиотека GNU C++ v3 ...
ii libstdc++6:amd64 10.3.0-1ubuntu1~20.04 amd64 Стандартная библиотека GNU C++ v3
libstdc++6
версия GCC 10.3; в -dev
package — это версия GCC 9.3.
dpkg-query --listfiles libstdc++-9-dev
показывает нам, что этот пакет предоставляет файлы заголовков, архивные библиотеки и документацию для разработки на C++ с GCC 9.
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
файл. Это название версии GCC 10 libstdc++, библиотеки поддержки GCC для C++. Вы можете получить сопоставление между этими именами и версиями GCC. здесь. Прокрутите вниз, и вы найдете несколько таблиц.