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)/%.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

相反,您可以使用makes 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”

没有规则可以制作目标Cuda + Qt + Linux

debian 2.6.26内核,make时提示 make[1]: *** 没有规则可以创建目标“modules”。 停止

从源文件生成目标文件的通用“make”规则

GNU make:规则专题