Этапы работы компилятора MSVC
Уважаемые Гуру, подскажите, где можно найти информацию по этапам работы MSVC? Насколько я понимаю они отличаются от классической схемы GCC Препрцессор-Транслятор-Ассемблер-Компоновщик. Поверхностное гугление не принесло результатов. Заранее благодарен.
Ответы (2 шт):
MSVC предоставляет инструменты Build Insights которые отображают и позволяют профилировать все стадии сборки.
В самом выводе системы сборки. После сборки проекта в окне вывода Visual Studio выбираем "Показать выходные данные из:" - "Сборка". Результат выглядит так:
1>------ Сборка начата: проект: CppConsole, Конфигурация: Debug Win32 ------
1>Сборка начата 19.10.2021 9:08:23.
1>Целевой объект InitializeBuildStatus:
1> Создание "Debug\CppConsole.tlog\unsuccessfulbuild", так как было задано "AlwaysCreate".
1>Целевой объект ClCompile:
1> CppConsole.cpp
1>Целевой объект Link:
1> CppConsole.vcxproj -> C:\PROJECTS_2017\CppConsole\Debug\CppConsole.exe
1>Целевой объект FinalizeBuildStatus:
1> Файл "Debug\CppConsole.tlog\unsuccessfulbuild" удаляется.
1> Обращение к "Debug\CppConsole.tlog\CppConsole.lastbuildstate".
1>
1>Сборка успешно завершена.
1> Предупреждений: 0
1> Ошибок: 0
1>
1>Прошло времени 00:00:01.04
========== Сборка: успешно: 1, с ошибками: 0, без изменений: 0, пропущено: 0 ==========
Видно, что в сборке есть несколько этапов, которые представлены "Целевыми объектами" (Target) MSBuild. Эти целевые объекты для С++ документированы здесь: https://docs.microsoft.com/en-us/cpp/build/reference/msbuild-visual-cpp-overview?view=msvc-160#targets. В нашем случае были такие этапы:
InitializeBuildStatus. Считывает результаты последней сборки, что позволяет выполнять сборку только тех входных файлов, которые изменились.
ClCompile. Вызывает компилятор, cl.exe, для каждого входного файла .cpp, получая на выходе объектный файл. Препроцессор включен в этот этап.
Link. Вызывает компоновщик, link.exe, подавая на вход объектные файлы и необходимые зависимости.
FinalizeBuildStatus. Соответственно, сохраняет результаты этой сборки в файл lastbuildstate, чтобы их можно было прочитать при последующих сборках.
Можно узнать больше о содержании этих этапов, включив более подробный вывод MSBuild (Параметры - Проекты и решения - Сборка и запуск - Уровень детализации выходных данных сборки проекта MSBuild - выбрать "Подробные").
Компоновка в проекте Visual Studio является отдельным этапом, но cl.exe может и автоматически вызывать компоновщик. Система проектов передает компилятору параметр /c, который отключает автоматическую компоновку, вероятно, потому что большинство реальных проектов имеют дополнительные этапы сборки, вроде компиляции ресурсов, которые должны идти до компоновки.
