#makefile #rules
#makefile создать файл #Правила
Вопрос:
Имея этот простой makefile:
VPATH = include CC := gcc CFLAGS := -I include -Wall -pedantic %: %.o include.o $(CC) -o $@ $^ %.o: %.c $(CC) $(CFLAGS) -c -o $@
lt;
Когда я запускаю его с именем программы (тем же именем, что и исходный код с расширением .c), я ожидаю, что будет запущено первое правило (поскольку я предоставил только имя без расширения) и второе, потому что для первого правила существует%.o
предварительное условие, которое точновторое правило.Наличие этих файлов в pwd:
client.c include makefile server6.c server.c
Теперь, если я сделаю
make server
:
Это такgcc -I include -Wall -pedantic server.c -o server
Другими словами, второе правило не срабатывает. нет никакого шага с созданием объектных файлов, даже если объектный файл указан в первом правиле в качестве предварительного условия. Так как же это возможно? Make — это просто игнорирование предварительного условия и попытка сделать только с помощью первого правила. Как это исправить?
Ответ №1:
Это потому, что make имеет встроенное правило для %: %.c
и make всегда будет выбирать правило шаблона, которое может напрямую создавать цель поверх правила шаблона, для которого требуется другое правило шаблона:
Однако обратите внимание, что правило, предварительные условия которого действительно существуют или упоминаются, всегда имеет приоритет над правилом с предварительными условиями, которые должны быть созданы путем объединения в цепочку других неявных правил.
Вы можете запустить make -r
, чтобы удалить все встроенные правила, или удалить их самостоятельно, добавив:
% : %.c
в ваш makefile.
Вы можете просмотреть все встроенные правила, выполнив make -p -f/dev/null