Gcc Make:没有规则来创建目标。为什么?

Jim*_*ell 1 gcc makefile build-error

我有这个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)
Run Code Online (Sandbox Code Playgroud)

为什么它给我这个错误,我该如何修复它?

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
Run Code Online (Sandbox Code Playgroud)

我正在运行 gcc 版本 4.9.3。谢谢。

Mad*_*ist 5

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

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

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

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

$(OBJ): $(DEPS)
Run Code Online (Sandbox Code Playgroud)

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