make: *** 没有规则来制作目标 'obj/logging.o','liso_server' 需要。停止
Posted
技术标签:
【中文标题】make: *** 没有规则来制作目标 \'obj/logging.o\',\'liso_server\' 需要。停止【英文标题】:make: *** No rule to make target 'obj/logging.o', needed by 'liso_server'. Stopmake: *** 没有规则来制作目标 'obj/logging.o','liso_server' 需要。停止 【发布时间】:2018-10-14 02:13:41 【问题描述】:这是我的 makefile 和 mu 字典包括标题、日志、obj、解析器、lisod.c,我不认为我忘记了一些文件,一些文件需要输出但它没有出现。 我的错误看起来像 make: *** No rule to make target '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】:考虑以下行...
$(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)
。
【讨论】:
以上是关于make: *** 没有规则来制作目标 'obj/logging.o','liso_server' 需要。停止的主要内容,如果未能解决你的问题,请参考以下文章
make[1]: *** 没有规则来制作 `firmware/am335x-pm-firmware.bin.gen.o' 需要的目标 `firmware/am335x-pm-firmware.bin'
make: *** 没有规则可以创建目标“menuconfig”
debian 2.6.26内核,make时提示 make[1]: *** 没有规则可以创建目标“modules”。 停止