От исходника до исполняемого файла
Вопрос
Расскажите, что происходит, когда вы собираете C++-программу из нескольких файлов: от .cpp до исполняемого файла.
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
Препроцессор: include, макросы, условная компиляция, единица трансляции
Компиляция каждой единицы отдельно в объектный файл
В объектном файле определённые символы и неразрешённые ссылки
Линковка: разрешение символов, статические библиотеки, релокации
Динамические библиотеки разрешаются загрузчиком при запуске
Типичные ошибки этапов: компиляции против линковки
Что могут спросить следом
- Почему шаблоны обычно определяют в заголовках?
- Как ускорить сборку большого проекта?
Разбор
Сборка идёт в несколько этапов. Препроцессор берёт каждый .cpp, вставляет текст всех включённых заголовков, раскрывает макросы и вырезает неактивные ветки #if: получается единица трансляции. Компилятор переводит её в машинный код и пишет объектный файл: там код, данные, таблица символов, которые этот файл определяет, и список ссылок на символы, которые он только использует. Каждый .cpp компилируется независимо, поэтому компилятору достаточно объявлений. Затем линковщик собирает объектные файлы и библиотеки, сопоставляет каждую ссылку с единственным определением, раскладывает секции и проставляет адреса. Ошибки «undefined reference» и «multiple definition» возникают именно здесь. Если используются динамические библиотеки, часть символов разрешает загрузчик при запуске программы. Понимание этапов помогает быстро чинить ошибки: синтаксис и типы ловит компилятор, а отсутствующие и лишние определения линковщик.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.