这是我的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
答案 0 :(得分:0)
考虑以下行...
$(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 directive来告诉它在哪里寻找与某些模式匹配的文件。在这种情况下,请尝试...
vpath %.c $(PARSE_DIR):$(LOG_DIR)
$(OBJ_DIR)/%.o: %.c $(DEPS)
$(CC) $(FLAGS) -c -o $@ $< $(CFLAGS)
现在,当make
查找logging.c
时,它将检查$(PARSER_DIR)
,然后是$(LOG_DIR)
。