Makefile没有检测到依赖项更改

时间:2015-02-08 10:20:33

标签: c makefile

我有一个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..."

1 个答案:

答案 0 :(得分:0)

我用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)有一个%符号时应该有$。除此之外,“适合我”。它也不应该包含任何命令(你的'echo'在这里并不是无害的。)