make: *** Нет правила для создания цели 'obj / logging.o', необходимой для 'liso_server'.Стоп - PullRequest
0 голосов
/ 14 октября 2018

это мой make-файл и словарь mu, включающий заголовок, log, obj, parser, lisod.c, и я не думаю, что забыл какой-то файл, какой-то файл должен быть выведен, но он не появляется.моя ошибка выглядит как make: *** Нет правила для создания цели 'obj / logging.o', необходимой для 'liso_server'.Стоп.

CC=gcc
CFLAGS= -g -I.
_DEPS = parse.h y.tab.h logging.h
_OBJ =logging.o parse.o y.tab.o lex.yy.o 
FLAGS = -g -Wall
PARSE_DIR = parser
LOG_DIR  = log
OBJ_DIR = obj
INCLUDE_DIR = header

DEPS = $(patsubst %, $(INCLUDE_DIR)/%, $(_DEPS))
OBJ = $(patsubst %,$(OBJ_DIR)/%, $(_OBJ))


default: all

all: liso_server

$(PARSE_DIR)/lex.yy.c: $(PARSE_DIR)/lexer.l

    flex -o $@ $^

$(PARSE_DIR)/y.tab.c: $(PARSE_DIR)/parser.y

    yacc -d $^
    mv y.tab.h $(INCLUDE_DIR)/

$(OBJ_DIR)/%.o: $(PARSER_DIR)/%.c $(LOG_DIR)/%.c $(DEPS)

      $(CC) $(FLAGS) -c -o $@ $< $(CFLAGS)

liso_server: $(OBJ)

    $(CC) -o $@ $^ $(CFLAGS)

.PHONY: clean

clean:

    rm -f $(OBJ_DIR)/*.o
    rm $(PARSE_DIR)/lex.yy.* $(PARSE_DIR)/y.tab.* $(INCLUDE_DIR)/y.tab.*
    rm liso_server

1 Ответ

0 голосов
/ 14 октября 2018

Рассмотрим следующую строку ...

$(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).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...