---
title: Компиляция и линковка
seo:
  description: >-
    Тема «Компиляция и линковка» для собеседования C++ Developer. Как проходит
    процесс компиляции срр-файлов в бинарный файл? Что именно компонует линкер?
  title: Компиляция и линковка — C++ Developer
---

[Все темы C++ Developer](/prep/c-developer)

Подтемы:

- [Процесс компиляции](#q-14bee738d69b81eb8e13c0b4475386e9)
- [Линковка](#q-14bee738d69b81cfb58be9b129e04dd9)

## <strong>Как проходит процесс компиляции срр-файлов в бинарный файл?</strong> [#q-14bee738d69b81eb8e13c0b4475386e9]

Процесс компиляции C++ файлов в бинарный файл можно разделить на несколько основных этапов&#58;

1. <strong>Препроцессинг</strong>&#58; Препроцессор обрабатывает директивы
   препроцессора (<code>&#35;include</code>, <code>&#35;define</code>,
   <code>&#35;ifdef</code> и др.), раскрывает макросы, удаляет комментарии и
   выполняет условную компиляцию.

1. <strong>Компиляция</strong>&#58; На этом этапе исходный код C++ преобразуется
   в ассемблерный код. Компилятор анализирует синтаксис и семантику программы,
   затем генерирует ассемблерный код для целевой архитектуры.

1. <strong>Ассемблирование</strong>&#58; Ассемблер преобразует ассемблерный код
   в машинный код, генерируя объектные файлы, которые содержат машинный код и
   информацию для дальнейшей линковки.

1. <strong>Линковка</strong>&#58; Линкер объединяет все объектные файлы и
   библиотеки в один исполняемый файл. На этом этапе разрешаются внешние и
   внутренние ссылки между различными частями программы.

Результатом этого процесса является бинарный файл, который можно запускать на целевой системе. Этот процесс может варьироваться в зависимости от используемого компилятора и настроек среды разработки.

:::note[Ссылки для изучения]

1. [Процесс компиляции файлов в С++](https://habr.com/ru/articles/478124/)
   :::

---

## <strong>Что именно компонует линкер?</strong> [#q-14bee738d69b81cfb58be9b129e04dd9]

Линкер в программировании — это инструмент, который объединяет различные объектные файлы и библиотеки в один исполняемый файл или библиотеку. В процессе компоновки линкер выполняет следующие задачи&#58;

1. <strong>Разрешение ссылок</strong>&#58; Линкер связывает внешние и внутренние
   ссылки между различными объектными файлами. Он ищет и соединяет вызовы
   функций и доступы к переменным с их определениями.

1. <strong>Объединение сегментов</strong>&#58; Собирает однотипные сегменты кода
   и данных из разных объектных файлов в единые секции исполняемого файла.

1. <strong>Оптимизация</strong>&#58; Удаляет избыточный код и данные, которые не
   используются в конечном приложении
   <code>&#40;dead code elimination&#41;</code>.

1. <strong>Динамическая компоновка</strong>&#58; Для динамических библиотек
   <code>&#40;DLL&#44; SO&#41;</code> линкер организует таблицы импорта и
   экспорта, которые используются при загрузке библиотек в память во время
   выполнения программы.

Результатом работы линкера является исполняемый файл или библиотека, готовые к запуску на целевой машине.

:::note[Ссылки для изучения]

1. [Компоновка объектных файлов и символов программы C++](https://habr.com/ru/articles/478124/)
   :::
