make:***'liso_server'不需要创建目标'obj / logging.o'的规则。停止

时间:2018-10-14 02:13:42

标签: makefile

这是我的makefile,并且mu字典包含标头,日志,obj,解析器,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 :(得分:0)

考虑以下行...

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

如果$(OBJ_DIR)/%.oobj/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 directive来告诉它在哪里寻找与某些模式匹配的文件。在这种情况下,请尝试...

vpath %.c $(PARSE_DIR):$(LOG_DIR)

$(OBJ_DIR)/%.o: %.c $(DEPS)
        $(CC) $(FLAGS) -c -o $@ $< $(CFLAGS)

现在,当make查找logging.c时,它将检查$(PARSER_DIR),然后是$(LOG_DIR)