Makefile
Автоматизируйте сборку
«Makefile» — бесплатный урок C Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения C Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс C Academy содержит 4 уроков всего.
Зачем нужны Makefile
Ручной ввод команд gcc быстро становится неудобным. Утилита make читает Makefile, в котором описано, как собрать проект, и выполняет только необходимые команды.
Её главное преимущество: она пересобирает файл только тогда, когда его входные данные новее выходного файла, что значительно сокращает время компиляции.
Структура правила
Правило состоит из трёх частей: цели, её предварительных условий и рецепта.
Строка рецепта MUST начинаться с настоящего символа табуляции TAB, а не с пробелов. Это самая распространённая ошибка в Makefile.
target: prerequisite1 prerequisite2
<TAB>command to build targetПервый Makefile
Этот Makefile собирает app из двух исходных файлов. Запуск make без аргументов собирает первую цель.
Если ни один исходный файл не изменился после последней сборки, make выводит сообщение «up to date» и ничего не делает.
app: main.c math_utils.c
gcc main.c math_utils.c -o appПравила раздельной компиляции
Раздельная сборка каждого объектного файла означает, что при изменении одного файла перекомпилируется только он.
make следует графу зависимостей: при изменении main.c повторно выполняются только сборка main.o и финальная компоновка.
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
math_utils.o: math_utils.c math_utils.h
gcc -c math_utils.cПеременные
Переменные устраняют повторения. Определите их в начале файла и подставляйте с помощью $(NAME).
Теперь изменить компилятор или флаги можно в одном месте.
CC = gcc
CFLAGS = -Wall -Wextra -g
app: main.o math_utils.o
$(CC) main.o math_utils.o -o appАвтоматические переменные
make предоставляет сокращённые обозначения внутри рецептов:
$@— имя цели$^— все предварительные условия$<— первое предварительное условие
Они помогают сделать рецепты короткими и корректными.
app: main.o math_utils.o
$(CC) $^ -o $@
main.o: main.c
$(CC) $(CFLAGS) -c $< -o $@Шаблонные правила
Одно шаблонное правило компилирует каждый файл .c в соответствующий файл .o, поэтому больше не нужно писать отдельное правило для каждого файла.
% соответствует любой основе имени; в сочетании с $< и $@ правило становится полностью универсальным.
%.o: %.c
$(CC) $(CFLAGS) -c $< -o $@Фиктивные цели
Такие цели, как clean, не создают файл с соответствующим именем. Объявите их с помощью .PHONY, чтобы make всегда выполняла их, даже если файл с именем «clean» существует.
clean удаляет артефакты сборки, чтобы принудительно выполнить полную сборку заново.
.PHONY: clean
clean:
rm -f *.o appПолный Makefile
Соберём всё вместе: переменные, шаблонное правило, правило компоновки и фиктивную цель очистки.
Такой Makefile легко масштабируется на множество файлов без изменений для каждого отдельного файла.
CC = gcc
CFLAGS = -Wall -Wextra -g
OBJS = main.o math_utils.o
app: $(OBJS)
$(CC) $^ -o $@
%.o: %.c
$(CC) $(CFLAGS) -c $< -o $@
.PHONY: clean
clean:
rm -f $(OBJS) appКак make принимает решения
make сравнивает временные метки. Цель пересобирается, если время изменения любого предварительного условия позже времени изменения цели или если цель не существует.
Поэтому важно указывать зависимости от заголовочных файлов: после изменения заголовка каждый зависящий от него объектный файл будет корректно пересобран.
Несколько целей и цели по умолчанию
Первая цель в Makefile является целью по умолчанию и запускается, когда Вы вводите обычную команду make. По соглашению её называют all.
Также можно собрать конкретную цель по имени, например make clean или make test, благодаря чему один Makefile предоставляет несколько полезных способов запуска.
.PHONY: all
all: app
test: app
./app --selftestБыстрая проверка
Разберите классическую ошибку в Makefile.
Итоги
Теперь Вы умеете автоматизировать сборку с помощью make:
- Правила состоят из цели, предварительных условий и рецепта с отступом TAB
- Переменные и автоматические переменные (
$@ $^ $<) сокращают повторения - Шаблонные правила (
%.o: %.c) универсально обрабатывают любые файлы .PHONYпомечает цели, не являющиеся файлами, напримерclean- make по временным меткам пересобирает только устаревшие части
Далее: сборка статических и динамических библиотек.
Часто задаваемые вопросы
Урок «Makefile» бесплатный?
Да — полный текст урока «Makefile» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс C Academy, подпишись на CoddyKit PRO. Курс C Academy содержит 4 уроков всего.
Чему я научусь в уроке «Makefile»?
Автоматизируйте сборку Ты практикуешь C Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать C Academy?
Предыдущий опыт не требуется. C Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.
Сколько времени занимает урок «Makefile»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке C Academy?
Да. Каждый урок C Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.