Простой ответ заключается в том, что% .o является целью, которая соответствует любому файлу, заканчивающемуся на .o.
"%. O:% .c" означает, что любой файл, заканчивающийся на .o, зависит от того жеимя файла, оканчивающееся на .c, должно присутствовать.
Следующая строка, начинающаяся с табуляции, является правилом, используемым при создании файла в форме% .o.Так, например:
Исполняемый файл "prog" требует сборки "main.o" (строка 6).make ищет правило для сборки main.o - находит два:
- Более конкретное правило (с указанием имени файла по имени):
main.o: main.c double.h coord2D.h coord3D.h
Это правилоопределяет все зависимости для main.o.Одним из следствий этого является то, что main.o будет перекомпилирован, если какой-либо из этих файлов новее, чем main.o (т.е. был изменен за это время)
Общее правило:
%.o: %.c
$(CC) $(CFLAGS) $< -c
Это запустит команду "gcc -std = c99 -W -Wall main.c -c" $ <"- это еще один подстановочный знак, это означает«включить здесь первое обязательное имя файла из целевой строки» - в данном случае main.c </p>
Другими подстановочными знаками в других строках здесь являются «$ @» (включая цель здесь) и $ ^ (включаяполный список предварительных условий здесь.) Команда для prog будет расширена до:
gcc main.o double.o coord2D.o coord3D.o -lm -o prog
Подобные правила подстановочных знаков позволяют создавать сложные проекты с очень небольшим количеством правил.