我无法理解(gnu)make的以下行为。这是一个重现问题的最小项目:
来源树:
project/
foo.c
include/
foo.h
main.c
makefile
foo.c的:
#include "foo.h"
foo.h中
/* blank */
main.c中:
int main(int argc, char *argv[])
{
return 0;
}
生成文件:
CC = gcc
INCLUDE = include
INCLUDE_HDRS = $(shell echo $(INCLUDE)/*.h)
SOURCES = $(filter-out main.c, $(shell echo *.c))
HEADERS = $(shell echo *.h)
OBJECTS = $(patsubst %.c, %.o, $(SOURCES))
%.o: %.c $(HEADERS) $(INCLUDE_HDRS)
$(CC) -c -o $@ $< -I./$(INCLUDE)
all: main.c $(OBJECTS)
$(CC) $< $(OBJECTS)
clean:
-rm -f *.o
-rm -f a.out
这不会构建,产生以下错误:
~$ make
gcc -c -o foo.o foo.c
foo.c:1:10: fatal error: foo.h: No such file or directory
#include "foo.h"
^~~~~~~
compilation terminated.
make: *** [<builtin>: foo.o] Error 1
编译命令以某种方式缺少-I./include标志。但是,如果我将任何.h文件添加到项目的根目录,它构建正常。我相信,如果根目录中没有.h文件,shell函数会产生垃圾,但这怎么会影响编译命令的构建方式呢?
以防万一:这是GNU Make 4.2.1,linux上的gcc版本7.2.1。