Компиляция нескольких файлов
Соберите программу из нескольких файлов.
«Компиляция нескольких файлов» — бесплатный урок C Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения C Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс C Academy содержит 4 уроков всего.
От исходного кода к программе
Превращение исходного кода C из нескольких файлов в исполняемый файл происходит в два этапа: компиляция и компоновка.
Каждый файл .c отдельно компилируется в объектный файл. Затем компоновщик объединяет все объектные файлы, разрешает ссылки между ними и создаёт одну запускаемую программу.
Сборка одной командой
Самый простой подход — передать все исходные файлы gcc одновременно. Компилятор соберёт каждый из них, а затем автоматически выполнит компоновку.
Флаг -o задаёт имя выходной программы. Перечислите все файлы .c; заголовки подключаются через #include и здесь не указываются.
gcc main.c math_utils.c -o appРаздельная компиляция
В крупных проектах каждый файл компилируют в объектный файл с помощью -c. При этом создаётся файл .o, но компоновка не выполняется.
Раздельная компиляция означает, что после изменения одного исходного файла нужно перекомпилировать только его, что ускоряет сборку крупных проектов.
gcc -c main.c /* produces main.o */
gcc -c math_utils.c /* produces math_utils.o */Этап компоновки
Получив объектные файлы, скомпонуйте их в исполняемую программу. Здесь gcc выступает в роли компоновщика: объединяет объекты и разрешает символы между файлами.
На этот раз -c не используется, поскольку нам нужна итоговая программа, а не ещё один объектный файл.
gcc main.o math_utils.o -o appЧто делает компоновщик
Компоновщик сопоставляет каждое использование символа с его определением.
Когда main.o вызывает add, компоновщик находит определение add в math_utils.o и связывает их. Он также подключает нужный программе код стандартной библиотеки.
Ошибки неопределённой ссылки
Если при компоновке забыть объектный файл, компоновщик не сможет найти определение и сообщит о неопределённой ссылке.
Это ошибка на этапе компоновки, а не ошибка компиляции: каждый файл успешно скомпилировался, но в итоговой команде не хватило нужного определения.
gcc main.o -o app
/* undefined reference to `add' */
/* fix: include math_utils.o */Полезные флаги предупреждений
Всегда компилируйте с включёнными предупреждениями. -Wall и -Wextra помогают заранее обнаружить вероятные ошибки.
Добавление -std=c11 выбирает стандарт языка, благодаря чему поведение предсказуемо в разных компиляторах. Эти флаги работают и при компиляции за один этап, и при раздельной компиляции.
gcc -Wall -Wextra -std=c11 -c main.c
gcc -Wall -Wextra -std=c11 -c math_utils.c
gcc main.o math_utils.o -o appПути поиска заголовков
Если заголовочные файлы находятся в другом каталоге, сообщите компилятору, где их искать, с помощью -I.
Например, -Iinclude добавляет каталог include/ в путь поиска, поэтому #include "math_utils.h" разрешается даже из другого каталога.
gcc -Iinclude -c src/main.c -o build/main.oЗачем нужна повторная компиляция
Преимущество раздельной компиляции особенно заметно, когда изменяется только один файл. Вы перекомпилируете объектный файл лишь для него, а затем повторно выполняете компоновку.
Однако при изменении заголовочного файла нужно перекомпилировать каждый исходный файл, который его подключает, поскольку текст заголовка входит в каждый из них.
/* edited math_utils.c only */
gcc -c math_utils.c
gcc main.o math_utils.o -o appАвтоматизация с помощью make
Вводить команды вручную быстро становится утомительно. Файл Makefile хранит правила и пересобирает только изменившиеся части.
Этот минимальный пример объединяет два объектных файла в app; make отслеживает временные метки файлов и решает, что нужно перекомпилировать.
app: main.o math_utils.o
gcc main.o math_utils.o -o app
main.o: main.c math_utils.h
gcc -c main.cПовторение полной сборки
Так выглядит весь процесс для небольшого проекта: от объектных файлов до готовой программы с включёнными предупреждениями.
Скомпилируйте каждый исходный файл, затем скомпонуйте объекты. Запустите результат, чтобы убедиться, что всё работает от начала до конца.
gcc -Wall -c main.c
gcc -Wall -c math_utils.c
gcc main.o math_utils.o -o app
./appБыстрая проверка
Проверьте, насколько хорошо Вы понимаете процесс сборки из нескольких файлов.
Повторение
Вы научились компилировать каждый файл .c в объектный файл с помощью -c, а затем объединять объекты в программу. Используйте -Wall для предупреждений, а -I — для путей поиска заголовков.
Неопределённые ссылки означают, что на этапе компоновки отсутствует объектный файл. Инструменты вроде make автоматизируют пересборку только изменившихся частей.
Часто задаваемые вопросы
Урок «Компиляция нескольких файлов» бесплатный?
Да — полный текст урока «Компиляция нескольких файлов» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс C Academy, подпишись на CoddyKit PRO. Курс C Academy содержит 4 уроков всего.
Чему я научусь в уроке «Компиляция нескольких файлов»?
Соберите программу из нескольких файлов. Ты практикуешь C Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать C Academy?
Предыдущий опыт не требуется. C Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.
Сколько времени занимает урок «Компиляция нескольких файлов»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке C Academy?
Да. Каждый урок C Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Заголовочные и исходные файлы
- Защита заголовков
- extern и связывание
- Компиляция нескольких файлов