Команда c++ в Linux: отличие от g++ и сборка проектов

Введение

В терминале дистрибутивов семейства Linux нередко встречается утилита c++, чье предназначение и внутренние механизмы вызывают вопросы у начинающих разработчиков. В данном материале мы разберем архитектурную взаимосвязь между c++ и g++, а также на наглядных примерах освоим компиляцию и выполнение программного кода в операционной системе.

Подготовка рабочего окружения и вызов компилятора c++

Для сборки проектов на C++ в среде Ubuntu требуется базовый стек утилит разработчика, который разворачивается командой apt-get update -qq && apt-get install -y build-essential.

Установка метапакета build-essential в Ubuntu

Определить точное расположение исполняемого файла компилятора в иерархии файловой системы позволяет вызов which c++.

Определение пути к бинарнику с помощью which c++

Команда c++ --version выводит сведения о текущем релизе используемого компилятора, параметрах сборки и целевой платформе.
⚙️ [Ключевые флаги сборки]

-o <file> : задает имя и путь для генерируемого исполняемого файла.
-c : выполняет трансляцию исходных текстов в объектный модуль (.o) без запуска компоновщика.
-Wall : выводит расширенный набор предупреждений о сомнительных или потенциально ошибочных конструкциях.
-O2 : активирует второй уровень оптимизации для баланса производительности и размера бинарника.
-std=<standard> : явно задает стандарт диалекта языка (например, c++17 или c++20).
-g : внедряет отладочную информацию для последующей инспекции через gdb.

Просмотр версии компилятора через c++ –version

Анализ симлинка /usr/bin/c++ и его взаимосвязи с g++

С помощью утилиты ls -l /usr/bin/c++ можно проинспектировать атрибуты файла и проследить цепочку символических ссылок в системе.
Полученный вывод наглядно демонстрирует, на какой конкретно компонент ОС ссылается псевдоним c++.

Проверка символической ссылки ls -l /usr/bin/c++

Выполнение конструкции update-alternatives --display c++ 2>/dev/null || readlink -f /usr/bin/c++ дает возможность либо запросить конфигурацию подсистемы альтернатив, либо напрямую вычислить абсолютный путь конечного исполняемого файла.
Это подтверждает факт того, что за псевдонимом c++ на самом деле скрывается стандартный компилятор g++.

Трассировка реального пути бинарника компилятора

Написание первого исходника и компиляция через c++

Для практической проверки создадим простейшую программу hello.cpp, выводящую приветственное сообщение в консоль.

Создание исходного файла hello.cpp

Запуск трансляции файла hello.cpp посредством утилиты c++ формирует оптимизированный бинарник hello с проверкой предупреждений компилятора.
Если синтаксис корректен, процесс сборки завершается молча, не выводя лишних сообщений в терминал.

Компиляция исходника с флагами -Wall и -O2

Запустим собранное приложение напрямую из текущей рабочей директории.
В окне терминала отобразится строка "Hello from Linux c++!", подтверждая работоспособность программы.

Запуск скомпилированного файла hello

Сборка программы с использованием стандарта C++20 (-std=c++20)

Чтобы задействовать современные конструкции языка — в частности, std::string_view и спецификатор constexpr — сформируем исходный файл modern.cpp.

Создание файла modern.cpp с кодом стандарта C++20

Флаг -std=c++20, переданный команде c++, указывает парсеру на необходимость сборки modern.cpp в соответствии со спецификацией C++20 и генерирует бинарник modern.
Отсутствие сообщений об ошибках свидетельствует об успешном завершении этапов трансляции и линковки.

Сборка кода с указанием стандарта -std=c++20

Остается протестировать полученный файл modern в действии.
Успешный вывод сообщения "Modern C++20 on Ubuntu" подтверждает корректную обработку современных языковых конструкций.

Тестирование бинарника modern в терминале

Мы подробно рассмотрели роль команды c++ в Linux, ее неразрывную связь с g++, а также практические нюансы сборки исходников под разными версиями стандартов.
Используя рассмотренные флаги и параметры, вы сможете без труда настроить гибкий пайплайн сборки C++ под свои задачи.