在 Makefile 中,是否总是附加变量 $(CFLAG)?

In Makefile, is the variable $(CFLAG) always appended?

考虑以下简单的 makefile

CC=gcc 
CFLAGS=-I.

all: hellomake

hellomake.o: hellomake.c hellomake.h    
    $(CC) -c hellomake.c -o hellomake.o $(CFLAGS)


hellofunc.o: hellofunc.c hellomake.h    
    $(CC) -c hellofunc.c -o hellofunc.o $(CFLAGS)

hellomake: hellomake.o hellofunc.o  
    $(CC) -o hellomake hellomake.o hellofunc.o


clean:  rm hellomake *.o

在这种情况下,必须在末尾包含变量 $(CFLAGS) 才能包含 .h 文件(在这种情况下 hellomake.h)。但是,在下面的makefile中,没有必要,变量会自动追加

CC=gcc
CFLAGS=-I.

hellomake: hellomake.o hellofunc.o
    $(CC) -o hellomake hellomake.o hellofunc.o

我的问题是,在什么情况下会追加 CFLAGS?为什么在第一个代码片段上不是这样?谢谢!

在您的第二个示例中,您依赖 %.o: %.c 案例的内置规则,并且该规则使用 $(CFLAGS)

如果您使用的是 GNU Make,则可以使用 make -qp 转储其内置内容。当我这样做时,我得到一个规则

%.o: %.c
#  commands to execute (built-in):
    $(COMPILE.c) $(OUTPUT_OPTION) $<

它指的是这个,在列表的较高位置:

COMPILE.c = $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c