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

时间:2017-03-08 16:02:11

标签: 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)

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

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。感谢。

1 个答案:

答案 0 :(得分:2)

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

如果您使用-d标记运行make,它会准确地告诉您它要查找的文件以及它无法找到的文件。请注意,输出很大,因此您应该将其重定向到要查看的文件。

您应该从模式规则中取出先决条件并单独定义:这将为您提供更好的信息:

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

$(OBJ): $(DEPS)

这样做,模式匹配所需的唯一事情是源文件存在。如果其中一个先决条件与您不匹配,则会得到关于此的特定错误,因为依赖关系是显式的,而不是由模式匹配推断。