【问题标题】:In Makefile, is the variable $(CFLAG) always appended?在 Makefile 中,是否总是附加变量 $(CFLAG) ?
【发布时间】: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))。当您添加链接器标志或额外的库时,这将有所帮助。而且它还省去了您重复目标文件名的麻烦。

标签: makefile cc cflags


【解决方案1】:

在您的第二个示例中,您依赖于 %.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

【讨论】:

    猜你喜欢
    • 2013-05-19
    • 2019-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-13
    • 1970-01-01
    • 1970-01-01
    • 2021-04-07
    相关资源
    最近更新 更多