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