我的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
答案 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}
的建议提出了这个问题,因为关于“没有规则制作目标拼写错误”的错误 - 我也会从我的规则中得到预期。
所以我可以同意蓬松,最好使用自动生成的依赖项。