Перейти к основному содержимому

Компиляторы и 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 runtimeglibc/msvcrt — malloc, FILE*, исключения на границе с ОС
Сопутствующие утилитыgdb, lldb, clang-tidy, clang-format, gcov, AddressSanitizer
Пара «компилятор + stdlib»

Линковать объект, собранный GCC с libstdc++, и код, собранный Clang с libc++, в одном процессе — рискованно. В одном продукте держите один toolchain и одну реализацию стандартной библиотеки. Подробнее про ABI — статья 28.


Обзор основных toolchain

ToolchainПлатформыСтандартная библиотека C++Когда выбирать
GCC (g++)Linux, многие embedded, Windows через MinGWlibstdc++серверы Linux, дистрибутивы, классический open-source стек
Clang (clang++)Linux, macOS, Windows, Android NDKlibc++ или 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-w64Windowslibstdc++ (как у 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 CPUoneAPI, документация по -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 kitMinGW kit
cl, MSVC STL, .lib от VSg++, libstdc++, иные пути к Qt
типичен в корпоративном Windowsудобен в open-source и учебных сценариях

Переключать kit в середине проекта без пересборки всех зависимостей нельзя — ABI и имена библиотек различаются.


Как выбрать toolchain

СценарийРазумный выбор
Сервер или CI на LinuxGCC или Clang; в Dockerfile зафиксируйте версию
macOS / iOS (нативно)Apple Clang (Xcode)
Desktop только WindowsMSVC + Visual Studio или CMake + MSVC generator
Кроссплатформенный CMake-проектClang или GCC на Linux/macOS, MSVC или Clang на Windows
Android NDKClang из NDK
Поддержка старого Borland/Embarcaderoсм. легаси C++ Builder, не смешивать с MSVC без плана

Для новых проектов в 2026 году типичный минимум стандарта — C++20 (см. о разделе); проверяйте таблицу поддержки фич у выбранного компилятора (cppreference — статус компиляторов).


Эквиваленты частых флагов

ЗадачаGCC / ClangMSVC
Стандарт 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,undefinedAddressSanitizer в новых 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).

См. также

См. также

Другие статьи этого же раздела в боковом меню (как на странице "О разделе").