Рассмотрим следующую строку ...
$(OBJ_DIR)/%.o: $(PARSER_DIR)/%.c $(LOG_DIR)/%.c $(DEPS)
Если $(OBJ_DIR)/%.o
соответствует obj/logging.o
, то вышеприведенное может быть расширено до ...
obj/logging.o: parser/logging.c log/logging.c
Следовательно, вы 'повторяя make
, что для построения obj/logging.o
необходимы оба parser/logging.c
и log/logging.c
.Он не может найти parser/logging.c
, отказывается от этого правила и, поскольку никакие другие подходящие правила не могут быть найдены, приходит к выводу, что он не знает, как сделать obj/logging.o
.
Вместо этого вы можете использоватьmake
s директива vpath , указывающая, где искать файлы, соответствующие определенным шаблонам.В этом конкретном случае попробуйте ...
vpath %.c $(PARSE_DIR):$(LOG_DIR)
$(OBJ_DIR)/%.o: %.c $(DEPS)
$(CC) $(FLAGS) -c -o $@ $< $(CFLAGS)
Теперь, когда make
ищет logging.c
, он проверит $(PARSER_DIR)
, а затем $(LOG_DIR)
.