Компиляторы и toolchain C++
Теория Debug/Release, CRT и toolset — в Конфигурация и сборка. Практика CMake — в CMake — первая программа. ABI между компиляторами — в Углублённые темы. Легаси Windows RAD (C++ Builder) — в отдельной заметке.
Зачем отдельная статья
C++ в исходниках один, а собирают его разными toolchain — наборами «драйвер компилятора + ассемблер + линкер + стандартная библиотека + отладчик». От выбора toolchain зависят флаги, сообщения об ошибках, ABI готовых .dll/.so и то, какие фичи стандарта реально доступны.
В разделе компиляторы уже упоминаются в вводной статье, справочнике и сборке. Здесь — сводное сравнение и правила выбора без повторения настроек Visual Studio построчно.
Как устроен toolchain
Типичная цепочка (упрощённо):
исходники (.cpp)
→ препроцессор (#include, #define)
→ компилятор (синтаксис → объектный код)
→ ассемблер (.s → .o / .obj)
→ линкер (объекты + библиотеки → .exe / .so / .dll)
| Роль | Примеры |
|---|---|
| Драйвер | g++, clang++, cl — одна команда для пользователя |
| Front-end | разбор C++ (у Clang и GCC свои; Intel icx на LLVM) |
| Стандартная библиотека C++ | libstdc++ (GCC), libc++ (LLVM), MSVC STL (Windows) |
| C runtime | glibc/msvcrt — malloc, FILE*, исключения на границе с ОС |
| Сопутствующие утилиты | gdb, lldb, clang-tidy, clang-format, gcov, AddressSanitizer |
Линковать объект, собранный GCC с libstdc++, и код, собранный Clang с libc++, в одном процессе — рискованно. В одном продукте держите один toolchain и одну реализацию стандартной библиотеки. Подробнее про ABI — статья 28.
Обзор основных toolchain
| Toolchain | Платформы | Стандартная библиотека C++ | Когда выбирать |
|---|---|---|---|
| GCC (g++) | Linux, многие embedded, Windows через MinGW | libstdc++ | серверы Linux, дистрибутивы, классический open-source стек |
| Clang (clang++) | Linux, macOS, Windows, Android NDK | libc++ или libstdc++ | строгая диагностика, LLVM/Clang в CI, Xcode, многие кросс-сборки |
MSVC (cl) | Windows (основной) | MSVC STL | нативные Win32-приложения, DirectX, интеграция с Visual Studio |
Intel oneAPI (icx/icpx) | Linux, Windows, macOS | часто совместим с выбранным LLVM-стеком | HPC, оптимизации под CPU Intel, OpenMP в корпоративных кластерах |
| MinGW-w64 | Windows | libstdc++ (как у GCC) | Qt/CMake на Windows без Visual Studio, переносимые .exe |
Классический Intel C++ Compiler (ICC) с проприетарным backend завершил активную линейку; для новых проектов ориентируйтесь на Intel oneAPI и компилятор icx на базе LLVM, а не на устаревшие гайды под icc.
GCC (GNU Compiler Collection)
GCC — эталонный компилятор в экосистеме GNU/Linux. Команда g++ — драйвер для C++: она подключает libstdc++ и по умолчанию линкует нужные системные библиотеки.
Сильные стороны
- широкая поддержка архитектур и встраиваемых целей;
- зрелые GNU-расширения (
__attribute__, встроенные__builtin_*); - связка с gdb, gcov (покрытие), gprof (профилирование при сборке с
-pg).
Ограничения
- сообщения об ошибках в шаблонном коде длиннее, чем у Clang (улучшается с каждым релизом);
- смена major-версии GCC может менять ABI
std::stringи др. — флаг_GLIBCXX_USE_CXX11_ABIдля старого кода.
Минимальная проверка версии и стандарта:
g++ --version
g++ -std=c++20 -Wall -Wextra -O2 main.cpp -o app
Официальный сайт: gcc.gnu.org.
Clang и LLVM
Clang — front-end для C-подобных языков в проекте LLVM. В связке Clang + LLVM даёт полноценный компилятор; цель проекта — модульная инфраструктура (парсинг, оптимизации, кодогенерация), а не только «замена GCC».
Сильные стороны
- развёрнутые диагностические сообщения (особенно в шаблонах);
- AddressSanitizer, UBSan, ThreadSanitizer (как и у GCC, через
-fsanitize=…); - экосистема clangd (LSP в редакторе), clang-tidy, clang-format — см. стиль и CI;
- инкрементальная компиляция и удобная интеграция в IDE.
На macOS системный toolchain по умолчанию — Clang. В Android NDK и Chromium долгие годы опираются на Clang. В ряде BSD-систем Clang стал компилятором по умолчанию вместо GCC — это индустриальный тренд, а не «мода».
Стандартная библиотека: на Linux Clang часто использует libstdc++ (как GCC); на macOS и при явной настройке — libc++. В CMake это задаётся флагами вроде -stdlib=libc++ (платформозависимо).
clang++ --version
clang++ -std=c++20 -Wall -Wextra -stdlib=libc++ main.cpp -o app
Документация: clang.llvm.org.
clangd и compile_commands.json
clangd читает ту же модель компиляции, что и при сборке. Файл compile_commands.json (генерирует CMake с -DCMAKE_EXPORT_COMPILE_COMMANDS=ON) подсказывает редактору include-пути и макросы. Без него подсветка и «перейти к определению» в большом проекте часто расходятся с реальной сборкой.
Microsoft Visual C++ (MSVC)
MSVC — компилятор C++ от Microsoft в составе Visual Studio (и Build Tools). Команда cl ориентирована на Windows API, DirectX, COM и интеграцию с Windows SDK.
Сильные стороны
- единый стек с MSBuild, отладчиком Visual Studio, профилировщиком;
- Platform Toolset (v142 для VS 2019, v143 для VS 2022) фиксирует версию ABI;
- официальный справочник языка — см. также раздел в статье 3.
Ограничения
- кросс-компиляция под Linux с
clне является основным сценарием; - флаги и runtime (
/MT,/MD,/std:c++20) отличаются от GCC/Clang — см. 1004.
Пример из Developer Command Prompt:
cl /EHsc /std:c++20 /W4 main.cpp
MSVC — это не синоним «компилятор C++ вообще», а Windows-centric toolchain. Для кроссплатформенного кода на Windows часто ставят Clang или MinGW рядом с CMake.
Intel oneAPI (icx)
Современная линейка Intel для C++ — oneAPI и компилятор icx (C) / icpx (C++), построенные на LLVM. Они наследуют идеи классического ICC (агрессивные оптимизации под микроархитектуру Intel, OpenMP), но входят в общую экосистему LLVM.
| Задача | Практика |
|---|---|
| Новый HPC/численный код на Intel CPU | oneAPI, документация по -qopt-* и OpenMP |
| Легаси-проект на старом ICC | план миграции на icx, проверка бенчмарков и флагов |
| Смешение с GCC/Clang в одном бинарнике | тот же принцип — один toolchain на границе DLL/.so |
Лицензия и состав пакета меняются — сверяйтесь с страницей загрузки oneAPI.
MinGW-w64 на Windows
MinGW-w64 поставляет g++ для Windows с целевой средой Win32/Win64 и libstdc++. Его выбирают, когда нужен GCC-подобный стек без Visual Studio — например, сборка Qt с kit MinGW (см. Qt Widgets).
| MSVC kit | MinGW kit |
|---|---|
cl, MSVC STL, .lib от VS | g++, libstdc++, иные пути к Qt |
| типичен в корпоративном Windows | удобен в open-source и учебных сценариях |
Переключать kit в середине проекта без пересборки всех зависимостей нельзя — ABI и имена библиотек различаются.
Как выбрать toolchain
| Сценарий | Разумный выбор |
|---|---|
| Сервер или CI на Linux | GCC или Clang; в Dockerfile зафиксируйте версию |
| macOS / iOS (нативно) | Apple Clang (Xcode) |
| Desktop только Windows | MSVC + Visual Studio или CMake + MSVC generator |
| Кроссплатформенный CMake-проект | Clang или GCC на Linux/macOS, MSVC или Clang на Windows |
| Android NDK | Clang из NDK |
| Поддержка старого Borland/Embarcadero | см. легаси C++ Builder, не смешивать с MSVC без плана |
Для новых проектов в 2026 году типичный минимум стандарта — C++20 (см. о разделе); проверяйте таблицу поддержки фич у выбранного компилятора (cppreference — статус компиляторов).
Эквиваленты частых флагов
| Задача | GCC / Clang | MSVC |
|---|---|---|
| Стандарт C++20 | -std=c++20 | /std:c++20 |
| Предупреждения | -Wall -Wextra -Wpedantic | /W4 |
| Оптимизация Release | -O2 или -O3 | /O2 |
| Отладочная сборка | -g | /Zi + конфигурация Debug |
| Статическая CRT (Windows) | — | /MT (см. 1004) |
| Санитайзеры | -fsanitize=address,undefined | AddressSanitizer в новых toolset |
| Строгое соответствие стандарту | -pedantic | /permissive- |
Один проект в CMake обычно задаёт эти флаги через target_compile_features и target_compile_options, а не вручную в IDE — см. 1006.
Типичные ошибки
| Симптом | Частая причина |
|---|---|
undefined reference to std::… | не та stdlib при линковке, смешение .a от разных компиляторов |
| Краш только в Release на Windows | /MD vs /MT между вашей DLL и библиотекой |
Разный размер std::string | разные версии GCC или dual ABI (_GLIBCXX_USE_CXX11_ABI) |
| Редактор «не видит» заголовки | нет compile_commands.json для clangd |
| C++20-код не компилируется | старый компилятор в CI, не обновлён CMAKE_CXX_STANDARD |
Краткий итог
- Toolchain — это компилятор, стандартная библиотека и соглашения линковки; «язык C++» в
.cppот этого не меняется. - GCC и Clang доминируют на Linux и в open-source; MSVC — на Windows; MinGW — GCC на Windows; Intel
icx— ниша оптимизаций и HPC. - Clang важен и как платформа инструментов (clangd, санитайзеры, статический анализ).
- В одном продукте держите один согласованный toolchain; границы между модулями при необходимости оформляйте через
extern "C"(статья 28).
См. также
См. также
Другие статьи этого же раздела в боковом меню (как на странице "О разделе"). C++ как язык системного программирования - ключевые принципы, область применения и инженерные требования к коду. Экосистема приложений на C++ - области применения языка от системного ПО до высоконагруженных вычислений. C++ — это мощный язык программирования общего назначения, который обеспечивает прямой доступ к аппаратным ресурсам компьютера при сохранении высокой производительности. Гайд по установке и настройке с написанием первой программы и её запуском. Директива препроцессора include используется для подключения заголовочных файлов в исходный код. Она сообщает компилятору вставить содержимое указанного файла в текущее место перед началом компиляции. Конфигурация — это набор правил и переменных, которые управляют процессом превращения исходного текста в исполняемый продукт. Примеры простых и полезных консольных приложений с демонстрацией концепций языка. Минимальный кроссплатформенный проект C++17 с CMake — структура, сборка и разбор CMakeLists построчно. Модульные тесты с GTest и Catch2 в CMake-проекте — зачем отдельный target, примеры и запуск ctest. Набор мини-проектов для закрепления C++ — консоль, RAII, CMake, Qt, ranges и опционально Vulkan. Набор советов, правил, принципов и обычаев в разработке на этом языке. Типизация, набор правил определения типа данных значений языка.C++ - язык системного программирования
Экосистема приложений на C++
Что требуется знать перед началом изучения языка программирования C++
Первая программа на C++
Начало работы с C++
Конфигурация и сборка в C++
Простые приложения на C++
CMake — первая программа
Google Test и Catch2 в C++
Практические задания по C++
Рекомендации по разработке на C++
Типы данных в C++