在 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
考虑以下简单的 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