Makefile 未检测到依赖项更改

Makefile not detecting dependency change

我有一个 Makefile 来帮助构建我的 C 项目 (GNU Make 3.82)。这里只是一个片段:

OBJ = file1.o file2.o file3.o

prog: $(OBJ)
    $(COMP) $(OPT) -o $@

$(OBJ): header.h

$(OBJ) 之后不需要命令,因为 make 能够像在 Makefile 的其余部分中那样处理它。所有对象都依赖于这个头文件,所以如果我更改它,它们应该被重新编译。然而他们没有。我的 Makefile 是基于这个 article.

注意:如果我为每个文件显式创建一个规则,它将起作用,如下所示:

file1.o: header.h


更新:我在 $(OBJ): header.h 行之后添加了一个 echo 语句,以查看 make 是否正在捕获它但没有做任何事情。不幸的是它也没有做任何事情。所以我想这意味着整个依赖行由于某种原因无法正常工作。


这是我的完整 Makefile,以防我在某处搞砸了:

CC   = clang
OPT  = -std=c99 -Wall -Wextra -g
LIBS = -lm
COMP = $(CC) $(OPT) $(LIBS)
EXEC = checker solver # Binary file(s)

OBJ = magic_check.o magic_io.o simple_checker.o

build: $(EXEC)
    @echo "Building complete."

solver: checker simple_solver.o
    $(COMP) simple_solver.o -o $@

checker: $(OBJ)
    $(COMP) $(OBJ) -o $@

%(OBJ): magic_io.h
    @echo "hello"

magic_check.o: magic_check.h
simple_checker.o: simple_checker.h magic_check.h
simple_solver.o: simple_solver.h

.PHONY: clean
clean:
    rm -f checker solver *.o *~ core
    @echo "Cleaning... :)"

rebuild: clean build
    @echo "Rebuilding..."

我已经用 make 3.81 启动了旧的 debian,它工作得很好(应该是这样):

OBJ:=file1.o file2.o file3.o main.o
TARGET:=prog

$(TARGET): $(OBJ)
    $(CC) -o $@ $(OBJ)

$(OBJ): test.h

结果:

# make
cc -c -o file1.o file1.c
cc -c -o file2.o file2.c
cc -c -o file3.o file3.c
cc -c -o main.o main.c
cc -o prog file1.o file2.o file3.o main.o
# make
make: `prog' is up to date.
# touch test.h
# make
cc -c -o file1.o file1.c
cc -c -o file2.o file2.c
cc -c -o file3.o file3.c
cc -c -o main.o main.c
cc -o prog file1.o file2.o file3.o main.o

我的例子和你的例子的不同之处在于,你的 %(OBJS) 有一个 % 符号,而它应该有 $。除此之外,"works for me"。它也不应该有任何命令(你的 'echo' 在这里不是无害的)。