← Назад к вопросам

Что делает линкер?

1.0 Junior🔥 211 комментариев
#Другое#ООП и проектирование#Сети и протоколы

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI29 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что делает линкер?

Линкер (компоновщик) — это инструмент, который преобразует скомпилированные объектные файлы в исполняемый файл или библиотеку. Это критически важный этап в процессе создания программы на C/C++.

Основные функции линкера

1. Объединение объектных файлов

Линкер берёт несколько объектных файлов (.o на Linux/Mac, .obj на Windows) и объединяет их в один. Каждый .o файл содержит машинный код функций и переменных из одного .cpp файла.

// main.cpp
extern int add(int a, int b);
int main() {
    int result = add(5, 3);
    return result;
}

// math.cpp
int add(int a, int b) {
    return a + b;
}

Компилятор создаст main.o и math.o, а линкер их соединит.

2. Разрешение символов (Symbol Resolution)

Когда компилятор встречает неизвестный символ (функцию, переменную), он создаёт ссылку на этот символ. Линкер ищет определение этого символа в других объектных файлах или библиотеках:

  • Внутренние символы — функции из других .o файлов
  • Внешние символы — функции из стандартной библиотеки (printf, malloc и т.д.)
  • Статические библиотеки (.a, .lib) — линкер ищет нужные объекты внутри архива
  • Динамические библиотеки (.so, .dll) — линкер добавляет информацию для загрузки во время выполнения

3. Переадресация адресов (Relocation)

В исходных объектных файлах адреса условные. Линкер переадресует все адреса на их окончательные позиции в исполняемом файле.

4. Управление секциями

Линкер объединяет одноименные секции из разных файлов:

  • .text — код
  • .data — инициализированные переменные
  • .bss — неинициализированные переменные
  • .rodata — константные строки

Ошибки линкера

Undefined reference — символ не определён нигде. Multiple definition — символ определён несколько раз.

Примеры команд

g++ main.cpp math.cpp -o program
g++ -c main.cpp -o main.o
g++ main.o math.o -o program
g++ main.o math.o -lm -o program

Динамическая vs Статическая линковка

Статическая — весь код встраивается в исполняемый файл. Большой размер, но нет зависимостей.

Динамическая — информация о загрузке библиотеки. Меньший размер, но библиотека должна быть при запуске.

Линкер — это критический мост между компилятором и операционной системой.

Что делает линкер? | PrepBro