Гид по технологиям

Как использовать компилятор g++ в Linux

• 5 min read • Программирование • Обновлено 26 Nov 2025
Как использовать g++ в Linux: руководство
Как использовать g++ в Linux: руководство

Введение: компилятор g++ в Linux — иллюстрация

Содержание

  • Что такое g++?
  • Установка
  • Базовое использование
  • Часто используемые флаги и сценарии (Wall, std, O, g, I, L, l и др.)
  • Создание статической и общей библиотек
  • Советы, распространённые ошибки и проверочный чеклист
  • Часто задаваемые вопросы

Что такое g++?

g++ — это командный компилятор для языка C++, входящий в набор GCC (GNU Compiler Collection). Он переводит исходный код C++ в машинный код, создавая объектные файлы и исполняемые файлы. Кратко: компилятор — это инструмент, который преобразует человеко-читаемый код в файл, понятный компьютеру.

Определение термина: компилятор — программа, преобразующая исходный код в объектный код или исполняемый файл.

Установка

Многие Linux-дистрибутивы поставляются с g++ по умолчанию. Если у вас его нет, используйте пакетный менеджер вашего дистро.

Ubuntu / Debian (apt):

sudo apt update && sudo apt install g++

Fedora / CentOS (dnf/yum):

sudo dnf install g++
# или для старых CentOS
sudo yum install g++

Arch Linux (pacman):

sudo pacman -S gcc

Загрузка .deb-пакета вручную (пример):

sudo curl http://ftp.de.debian.org/debian/pool/main/g/gcc-defaults/g++_10.2.1-1_amd64.deb -O
sudo dpkg -i g++_10.2.1-1_amd64.deb

Проверка установленной версии:

g++ --version

Проверка версии g++

Примечание: версии меняются — в исходном материале говорилось о версии 11.2.0 (июль 2021). Для актуальности проверяйте официальные релизы GCC.

Базовое использование

Посмотреть справку и доступные опции:

g++ --help

Просмотр внутренних спецификаций компилятора:

g++ --dumpspecs

Компиляция одного файла (по умолчанию создаётся a.out):

g++ main.cpp
./a.out

Задать имя исполняемого файла с помощью -o:

g++ -o main main.cpp
./main

Компиляция и объединение нескольких объектных файлов:

# Компиляция исходников в объектные файлы
g++ -c file1.cpp -o file1.o
g++ -c file2.cpp -o file2.o

# Линковка в исполняемый файл
g++ -o myapp file1.o file2.o

Указание системного корня для поиска библиотек/заголовков (редкий кейс):

g++ --sysroot=/path/to/sysroot -o main main.cpp

Результат компиляции g++

Часто используемые флаги и сценарии

Краткое руководство по ключевым флагам (одна строка — объяснение):

  • -Wall — включить большинство предупреждений компилятора.
  • -Wextra — дополнительные предупреждения.
  • -std=c++17 (или c++11, c++20) — выбрать стандарт языка.
  • -O0, -O1, -O2, -O3, -Ofast — уровни оптимизации (O0 — без оптимизации для отладки).
  • -g — включить отладочную информацию (для gdb).
  • -c — скомпилировать в объектный файл (.o), не линковать.
  • -I/path/to/include — добавить каталог для поиска заголовков.
  • -L/path/to/lib — добавить каталог для поиска библиотек при линковке.
  • -lname — при линковке подключить библиотеку libname.so или libname.a (пример: -lm для libm).
  • -fPIC — компиляция position-independent code (нужно для создания общих библиотек).
  • -shared — создавать общую библиотеку (.so).
  • -static — статическая линковка (если система и библиотеки поддерживают).

Примеры:

# Включаем предупреждения и стандарт C++17
g++ -std=c++17 -Wall -Wextra -o app main.cpp

# Компиляция для отладки
g++ -std=c++17 -g -O0 -o app_dbg main.cpp

# Оптимизация для релиза
g++ -std=c++17 -O2 -march=native -o app_release main.cpp

# Компиляция с дополнительным include и библиотечным путем
g++ -I/usr/local/include -L/usr/local/lib -o app main.cpp -lmylib

Важно: комбинирование -static и динамических библиотек может привести к ошибкам, если требуемые статические версии отсутствуют.

Создание статической и общей библиотек

Создание статической библиотеки (.a):

# Компилируем исходник в объектный файл
g++ -c -O2 -std=c++17 utils.cpp -o utils.o

# Создаём архив библиотеки
ar rcs libutils.a utils.o

# Используем библиотеку при линковке
g++ -o app main.cpp libutils.a

Создание общей (разделяемой) библиотеки (.so):

# Компилируем с флагом -fPIC
g++ -c -fPIC utils.cpp -o utils.o

# Собираем общую библиотеку
g++ -shared -o libutils.so utils.o

# Линковка с общей библиотекой
g++ -o app main.cpp -L. -lutils
# При запуске может понадобиться указать LD_LIBRARY_PATH:
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.
./app

Совет: для паковки в систему используйте стандартные механизмы сборки (Makefile, CMake). CMake особенно полезен для кросс-платформенных проектов.

Советы, распространённые ошибки и проверочный чеклист

Kороткий чеклист перед коммитом кода:

  • Проходит сборка в режиме отладки и в релизе (-g и -O2).
  • Запущены unit- и интеграционные тесты после сборки.
  • Установлены необходимые include и lib-пути.
  • Нет игнорируемых предупреждений — включён zumindest -Wall/-Wextra.
  • Проверена совместимость стандартов (std=c++14/17/20).

Распространённые ошибки и быстрые действия:

  • Ошибка «undefined reference to X»: пропущена библиотека при линковке или неправильный порядок аргументов; убедитесь, что -lXXX указан после объектных файлов.
  • Ошибка «No such file or directory» при include: добавьте -I/path или исправьте пути заголовков.
  • Права на исполнение отсутствуют: после сборки убедитесь, что файл имеет бит выполнения (chmod +x ./app).
  • Несовместимость ABI между компиляторами: при использовании бинарных библиотек на разных компиляторах/версиях ABI могут отличаться.

Рекомендации для CI/CD:

  • Собирайте в контейнере с чистым окружением (Docker) для воспроизводимости.
  • Разбивайте стадии: build (debug), test, build (release), упаковка.
  • Кешируйте зависимости, но очищайте артефакты сборки при необходимости.

Роли и краткие задачи:

  • Разработчик: локальная сборка, отладка, юнит-тесты.
  • Инженер сборки/CI: настройка скриптов и образов для reproducible builds.
  • Релиз-инженер: упаковка библиотек/артефактов, подпись и проверка совместимости.

Часто задаваемые вопросы

1. Можно ли использовать g++ для компиляции .c-файлов?

Да, технически можно. g++ будет трактовать исходный файл как C++ при компиляции, поэтому если код написан на чистом C, лучше использовать gcc или явно указывать соответствующий язык/флаги. Для компиляции C-файла без линковки в объектный файл используйте:

gcc -c example.c -o example.o
# или g++ если нужно явно слинковать как C++ (не рекомендуется для чистого C)
g++ -c example.c -o example.o

Если вы хотите, чтобы g++ компилировал файл как C (а не C++), используйте gcc или указывайте параметр компиляции, принятый вашим toolchain.

2. Чем отличается gcc от g++?

gcc — общий драйвер компилятора для языков семейства GNU (C, C++ и др.). g++ — это тот же компилятор, но с поведением и настройками по умолчанию, ориентированными на C++ (например, по умолчанию линковка стандартной библиотеки C++ и обработка файлов .cpp как C++). В большинстве случаев для C++ проектов удобнее использовать g++.

3. Какая последняя версия g++?

В исходном материале упоминалась версия 11.2.0 (июль 2021). Версии GCC и g++ регулярно обновляются; для актуальной информации смотрите официальный сайт проекта GNU или репозитории вашего дистрибутива.

Критерии приёмки

  • Код компилируется в режиме релиза без ошибок.
  • Все unit-тесты проходят.
  • Сборка воспроизводима в CI (контейнер/образ указан в pipeline).
  • Пакеты/артефакты готовы для дистрибуции (DEB/RPM/tarball).

Короткий справочник/cheat sheet

  • Скомпилировать и запустить:
    g++ -std=c++17 -Wall -O2 -o app main.cpp
    ./app
  • Скомпилировать объект и линковать отдельно:
    g++ -c main.cpp -o main.o
    g++ -c utils.cpp -o utils.o
    g++ -o app main.o utils.o -L. -lutils
  • Создать статическую библиотеку:
    g++ -c utils.cpp -o utils.o
    ar rcs libutils.a utils.o
  • Создать общую библиотеку:
    g++ -fPIC -c utils.cpp -o utils.o
    g++ -shared -o libutils.so utils.o

Итог

g++ — гибкий и мощный инструмент для сборки C++ проектов в Linux. Изучите основные флаги, используйте стандарты (std=c++17/20), включайте предупреждения (-Wall, -Wextra) и применяйте разграничение между сборкой и линковкой (флаг -c). Для больших проектов применяйте инструменты сборки (CMake, Make) и интегрируйте сборку в CI для надёжности.

Справочная иллюстрация: компиляция и линковка

Важное: всегда тестируйте сборку в среде, близкой к продакшену, и фиксируйте версии компилятора в документации проекта.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Несколько аккаунтов Skype: Multi Skype Launcher
Программное обеспечение

Несколько аккаунтов Skype: Multi Skype Launcher

Журнал для работы: повысить продуктивность
Productivity

Журнал для работы: повысить продуктивность

Персональные звуки уведомлений на Android
Android.

Персональные звуки уведомлений на Android

Скачивание шоу Hulu для офлайн‑просмотра
Стриминг

Скачивание шоу Hulu для офлайн‑просмотра

Microsoft Start: персонализированная новостная лента
Новости

Microsoft Start: персонализированная новостная лента

Как изменить имя в Epic Games быстро
Гайды

Как изменить имя в Epic Games быстро