【发布时间】:2020-05-04 08:13:25
【问题描述】:
考虑以下简单的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?为什么第一个代码sn-p上不是这样?谢谢!
【问题讨论】:
-
在第二种情况下(第二个 makefile),您没有编译步骤(这是使用
h文件的地方)。您只是将过去构建的事物联系起来。这就是为什么gcc不关心-I. -
顺便说一句,链接规则最好写成
$(LINK.o) $^ $(LDLIBS) -o $@(复制内置的%:%.o规则,除了过时的$(LOADLIBES))。当您添加链接器标志或额外的库时,这将有所帮助。而且它还省去了您重复目标文件名的麻烦。