Вопрос или проблема
Я успешно использовал инструкции с https://linuxize.com/post/how-to-install-gcc-compiler-on-ubuntu-18-04/, чтобы обновить версию gcc раньше, но они не работают для gcc-14. Как установить gcc-14 и g++-14 на Ubuntu 22.04 и 24.04?
Я пока не решаюсь покинуть Ubuntu 22.04 LTS, но мне нужен g++14. Команда sudo apt-get gcc-14
не работала для меня, так как по какой-то причине она установила clang++14 (возможно, это была ошибка с моей стороны). Однако мне удалось следовать инструкциям, которые я нашел на https://www.dedicatedcore.com/blog/install-gcc-compiler-ubuntu/
Я выполнил следующие шаги:
sudo apt install build-essential
sudo apt install libmpfr-dev libgmp3-dev libmpc-dev -y
wget http://ftp.gnu.org/gnu/gcc/gcc-14.1.0/gcc-14.1.0.tar.gz
tar -xf gcc-14.1.0.tar.gz
cd gcc-14.1.0
./configure -v --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu --prefix=/usr/local/gcc-14.1.0 --enable-checking=release --enable-languages=c,c++ --disable-multilib --program-suffix=-14.1.0
make
sudo make install
А если вы хотите сделать его основным…
sudo update-alternatives --install /usr/bin/g++ g++ /usr/local/gcc-14.1.0/bin/g++14.1.0 14
sudo update-alternatives --install /usr/bin/gcc gcc /usr/local/gcc-14.1.0/bin/gcc14.1.0 14
После этого g++
показал, что я использую версию 14.1.0. Я смог скомпилировать свой проект, который включал некоторые функции c++20/23, которых не было в предыдущих версиях g++ (chrono/format).
GCC-14 (и G++-14) доступен в репозитории Universe для Ubuntu 24.04, что видно в архиве пакетов Ubuntu.
Очевидно, что этот пакет недоступен для Ubuntu 22.04, поэтому установка на 22.04 потребует вмешательства сторонних разработчиков, или вам придется скомпилировать его самостоятельно.
Смотрите здесь, как активировать репозитории Universe.
С небольшим умением в соединении CMake и Docker, вы действительно можете компилировать с помощью gcc14 на Ubuntu 22.04 (или любом Linux, который не поддерживает gcc14), и вся настройка будет в исходном коде вашего проекта.
Настройка имеет docker-compose.yml:
services:
gcc:
build:
context: .
dockerfile: Dockerfile-gcc
который создает пользовательский образ docker из простого Dockerfile, названного Dockerfile-gcc
, основанного на официальном образе GCC docker:
FROM gcc:latest
RUN (ln -s /usr/local/bin/* /usr/bin || true) > /dev/null 2> /dev/null
Обратите внимание на создание символической ссылки с скрытием любых ошибок (так как есть некоторые незначительные). Официальный образ GCC имеет g++14 в /usr/local/bin
, но Ubuntu помещает его в /usr/bin
, а CMake требует полный путь к компилятору, который он может найти. Это означает, что образ docker должен иметь исполняемый файл компилятора в том же месте, что и в Ubuntu (да, эта настройка обманывает CMake, не принимайте это близко к сердцу).
Чтобы действительно заставить CMake запустить gcc в образе Docker, воспользуйтесь настройками запуска компилятора CMake (как это видно в моем CMakePresets.json
файле в разделе "cacheVariables"
):
"CMAKE_CXX_COMPILER_LAUNCHER": "/usr/bin/docker;compose;run;--rm;-v;\"$PWD/../..\":\"$PWD/../..\";-w;\"$PWD\";gcc"
Монтирование “$PWD/../..
” обусловлено другими настройками сборки в моей конфигурации, которые помещают рабочую директорию CMake в build/debug
или build/release
, и корневая директория исходного кода должна быть видимой компилятору. Ваша точка монтирования может быть другой.
Способность компилятора CMake действительно нацелена на такие вещи, как ccache, но, эй, использование docker для запуска компилятора кажется разумным решением тоже 🙂
Но, я уверен, что вы задаетесь вопросом (как и я),
Что насчет стадии линковки? Вы можете использовать CMAKE_CXX_LINKER_LAUNCHER
. Вы
не используете линковщик gcc14.
Вы правы и получите дополнительные баллы за знание о линковщике, но, по крайней мере для меня, обычный Ubuntu-gcc может линковать объектные файлы, скомпилированные с помощью gcc14. Кроме того, официальный файл docker gcc основан на каком-то базовом Debian, так что линковка с любыми системными библиотеками в образе docker пугает меня больше, чем использование линковщика на Ubuntu.
Внимание
libstdc++ изменился в g++14, в частности, теперь экспортируется и используется __cxa_call_terminate@@CXXABI_1.3.15. Вам нужно скопировать /usr/local/lib64/libstdc++.so из официального образа и развернуть вместе с вашим исполняемым файлом или общей библиотекой (и установить RPATH, чтобы общая библиотека была найдена)
gcc-14 недоступен в репозиториях apt Ubuntu 22.04, но он доступен в репозиториях conda. mamba
, который является заменой conda для C++, достаточно быстрый, как apt, и с ним легко работать.
# предположение: mamba доступен, и окружение (например, base) активно
$ mamba install conda-forge::gcc=14.1.0 conda-forge::gxx=14.1.0
# проверить
$ which gcc g++
~/mambaforge/bin/gcc
~/mambaforge/bin/g++
Посмотрите другие версии gcc/g++ доступные для вашей платформы:
Чтобы установить mamba,
name=Miniforge3-$(uname)-$(uname -m).sh
wget "https://github.com/conda-forge/miniforge/releases/latest/download/$name"
bash $name -b -p ~/mambaforge
~/mambaforge/bin/mamba init bash
rm $name
Или следуйте инструкциям в README @ https://github.com/conda-forge/miniforge?tab=readme-ov-file#install
Я использовал conda/mamba как другой способ установки пакетов. Я знаю, что некоторые из вас будут в ужасе от слов “установите gcc через conda”. Поэтому вот более длинное объяснение, почему это не безумная идея:
conda/mamba предназначен не только для библиотек Python! Они могут устанавливать системные библиотеки, и это работает на разных операционных системах (Windows/Linux/OSX), а также на различных архитектурах (x86/x86_64/aarch64). Компилирование gcc из исходников казалось слишком трудоемким занятием, даже после сборки мне нужно было позаботиться о экспорте некоторых переменных окружения (PATH, LD_LIBRARY_PATH и т. д., от которых я пытаюсь уклониться). conda/mamba изолирует библиотеки таким образом, что неисправные/несовместимые пакеты не нарушают функциональность операционной системы. Плохая новость заключается в том, что у нас меньше доверия к тому, кто компилировал пакеты и были ли в коде нежелательные изменения.
Ответ или решение
Установка GCC-14 на Ubuntu 22.04 и 24.04
Введение
GCC (GNU Compiler Collection) является компилятором, который поддерживает множество языков программирования, включая C и C++. Если вам необходимо установить версию GCC-14 на Ubuntu 22.04 или 24.04, приведенные ниже инструкции помогут вам в этом процессе.
Установка GCC-14 на Ubuntu 22.04
На данный момент в репозиториях Ubuntu 22.04 GCC-14 не доступен, поэтому потребуется скомпилировать его из исходников. Следуйте этим шагам:
-
Установите необходимые зависимости:
Откройте терминал и выполните следующие команды:sudo apt update sudo apt install build-essential libmpfr-dev libgmp-dev libmpc-dev wget
-
Скачайте исходный код GCC-14:
wget http://ftp.gnu.org/gnu/gcc/gcc-14.1.0/gcc-14.1.0.tar.gz tar -xf gcc-14.1.0.tar.gz cd gcc-14.1.0
-
Настройте сборку:
Теперь выполните конфигурацию для сборки:./configure -v --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu --prefix=/usr/local/gcc-14.1.0 --enable-checking=release --enable-languages=c,c++ --disable-multilib --program-suffix=-14.1.0
-
Соберите и установите:
Выполните сборку и установку GCC:make -j$(nproc) # Используйте все доступные ядра sudo make install
-
Сделайте GCC-14 версией по умолчанию:
Если вы хотите сделать установленный GCC-14 версией по умолчанию, выполните следующие команды:sudo update-alternatives --install /usr/bin/g++ g++ /usr/local/gcc-14.1.0/bin/g++14.1.0 14 sudo update-alternatives --install /usr/bin/gcc gcc /usr/local/gcc-14.1.0/bin/gcc14.1.0 14
Теперь вы можете проверить версию GCC и G++:
gcc --version
g++ --version
Установка GCC-14 на Ubuntu 24.04
На Ubuntu 24.04 GCC-14 доступен в репозиториях Universe, поэтому установка будет значительно проще:
-
Включите репозиторий Universe:
Если он еще не активирован, выполните:sudo add-apt-repository universe sudo apt update
-
Установите GCC-14:
Теперь вы можете установить GCC-14 и G++-14 с помощью:sudo apt install gcc-14 g++-14
После завершения установки вы можете проверить версии так же, как и для Ubuntu 22.04.
Альтернативные методы установки
-
Использование conda/mamba:
Если вы предпочитаете использоватьconda
илиmamba
, вы можете установить GCC-14 следующим образом:mamba install conda-forge::gcc=14.1.0 conda-forge::gxx=14.1.0
Убедитесь, что
mamba
уже установлен и активирована среда. -
Использование Docker:
Если вы хотите избежать установки непосредственно на вашу машину, можно использовать Docker с образом GCC, чтобы создать контейнер для сборки вашего проекта.
Заключение
Установка GCC-14 на Ubuntu 22.04 требует компиляции из исходников, в то время как для Ubuntu 24.04 это можно сделать через встроенные репозитории. Альтернативные методы, такие как использование conda/mamba
или Docker, также являются хорошими вариантами для установки компилятора. Не забудьте проверить правильность установки, запустив соответствующие команды для проверки версии.