我有这个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。感谢。
答案 0 :(得分:2)
这意味着您的模式规则不被make视为有效。很可能这意味着您定义的先决条件之一不存在且无法创建。
如果您使用-d
标记运行make,它会准确地告诉您它要查找的文件以及它无法找到的文件。请注意,输出很大,因此您应该将其重定向到要查看的文件。
您应该从模式规则中取出先决条件并单独定义:这将为您提供更好的信息:
$(ODIR)/%.o: %.c
$(CC) -c -o $@ $< $(CFLAGS)
$(OBJ): $(DEPS)
这样做,模式匹配所需的唯一事情是源文件存在。如果其中一个先决条件与您不匹配,则会得到关于此的特定错误,因为依赖关系是显式的,而不是由模式匹配推断。