Gcc Make:没有制定目标的规则。为什么?

Gcc Make: No rule to make target. Why?

我有这个 makefile。

IDIR=-I../inc/pvt -I../inc/pub
CC=gcc
CFLAGS=-I$(IDIR)

ODIR=obj
LDIR =../lib

_DEPS = teos_config.h teos_linkedlist.h teos_error.h teos_event.h teos_task.h
DEPS = $(patsubst %,$(IDIR)/%,$(_DEPS))

_OBJ = teos_event.o teos_init.o teos_linkedlist.o teos_log.o teos_main.o teos_mem.o teos_task.o
OBJ = $(patsubst %,$(ODIR)/%,$(_OBJ))

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

teosmake: $(OBJ)
    gcc -o $@ $^ $(CFLAGS)

为什么会出现这个错误,我该如何解决?

make -C src
make[1]: Entering directory 'C:/Users/<user>/git/teos/src'
make[1]: *** No rule to make target 'obj/teos_event.o', needed by 'teosmake'.  S
top.
make[1]: Leaving directory 'C:/Users/<user>/git/teos/src'
makefile:6: recipe for target 'teos_root' failed
make: *** [teos_root] Error 2

我是 运行 gcc 4.9.3 版。谢谢

这意味着您的模式规则被 make 认为无效。这很可能意味着您定义的先决条件之一不存在且无法创建。

如果您 运行 使用 -d 标志进行制作,它将准确地告诉您它正在寻找哪些文件以及找不到哪些文件。请注意,输出量很大,因此您应该将其重定向到一个文件中查看。

你应该从模式规则中取出先决条件并单独定义它们:这会给你一个更好的信息:

$(ODIR)/%.o: %.c
        $(CC) -c -o $@ $< $(CFLAGS)

$(OBJ): $(DEPS)

采用这种方式,模式匹配所需的唯一条件就是源文件存在。如果先决条件之一不匹配,您将收到一个特定的错误,因为依赖关系是显式的,而不是由模式匹配推断的。