我有这个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。谢谢。
,这意味着您的模式规则被视为有效。很可能意味着您定义的先决条件之一不存在,也不能创建。
如果您使用-d
标志进行运行,它将准确地告诉您它想要的文件以及找不到哪个文件。请注意,输出很大,因此您应该将其重定向到文件以查看。
您应该从模式规则中删除先决条件并分别定义它们:这将为您提供更好的消息:
$(ODIR)/%.o: %.c
$(CC) -c -o $@ $< $(CFLAGS)
$(OBJ): $(DEPS)
这样做,您唯一需要匹配的模式需要的就是存在源文件。如果先决条件之一与不匹配,您会遇到特定错误,因为依赖关系是明确的,而不是通过模式匹配来推断。