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' 在这里不是无害的)。
我有一个 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' 在这里不是无害的)。