Makefile:带模式的目标不起作用

时间:2011-10-03 22:15:44

标签: makefile gnu-make

我的Makefile看起来像这样:

BIN     = bin
OBJECTS = object1.o \
          object2.o \
          object3.o
HDR     = $(OBJECTS:%.o=%.h) header1.h header2.h
MAIN    = main.c

CC      = gcc
CFLAGS  = -Wall -g -std=c99 -fstack-protector-all
LDFLAGS = -lpthread

$(BIN): $(OBJECTS) $(MAIN)
    $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $^

%.o: %.c $(HDR)
    $(CC) $(CFLAGS) -c $< -o $@

似乎未使用%.o: %.c $(HDR)规则。使用选项make -r进行调用时,它表示没有规则可以制作目标object.o。每个目标文件的构建应该依赖于每个头文件。我错过了什么?

编辑:我应该提一下,在执行echo $(HDR)时看起来变量包含正确的值: object1.h object2.h object3.h header1.h header2.h

3 个答案:

答案 0 :(得分:2)

在HDR的声明中,请尝试$(OBJECTS:.o = .h)。或者,更好的是,使用gcc -MM或类似内容generate your dependencies instead

答案 1 :(得分:2)

模式规则不能具有辅助属性,如${HDR}

使用:

%.o : %.c
        $(CC) $(CFLAGS) -c $< -o $@

${OBJECTS}: ${HDR}

答案 2 :(得分:0)

好的,给定的Makefile应该可以工作,我的一个头文件名中有一个拼写错误。

这是一个可怜的,但制作并没有警告。似乎当基于模式的规则缺少先决条件而不是它被忽略时。而是使用内置的.o创建规则。

Jonathan Leffler关于${OBJECTS}: ${HDR}的建议提出了这个问题,因为关于“没有规则制作目标拼写错误”的错误 - 我也会从我的规则中得到预期。

所以我可以同意蓬松,最好使用自动生成的依赖项。