我的Makefile是:
OBJS = b.o c.o a.o
FLAGS = -Wall -Werror
CC = gcc
test: $(OBJS)
$(CC) $(FLAGS) $(OBJS) -o test
b.o: b.c b.h
$(CC) $(FLAGS) -c b.c
a.o: a.c b.h c.h
$(CC) $(FLAGS) -c a.c
c.o: c.c c.h
$(CC) $(FLAGS) -c c.c
clean:
rm a
rm *.o
all: test
如果我再次make
然后再make
,则会始终重建'test'。为什么这样做?
即使我这样做:make a.o
它会重建......如果有帮助,我会在linux上运行。
在Windows中如果我通过'test.exe'更改'test'而'-o test''更改'-o test',它可以正常工作。 所以我想由于某种原因,我的linux中的'make'无法检查目录中我的文件的日期戳。
我固定了它! .c是在Windows中创建的。我在vi中打开了所有的.c和.h,没有做任何事情保存更改,一切正常。我认为这样做的日期戳是固定的。
答案 0 :(得分:14)
你的第一条规则是:
test: $(OBJS)
这意味着如果名为“test”的文件不存在,则该规则应该运行并创建它。由于'test'从不存在(该规则实际上并不创建名为'test'的文件),因此每次都会运行。您应该将'test'更改为'a',即该规则的实际输出
为了将来参考,如果规则实际上没有在左侧创建该事物,则应将其标记为:
.PHONY: test
答案 1 :(得分:2)
您需要指定 test 是phony target:
OBJS = b.o c.o a.o
CFLAGS = -Wall -Werror
CC = gcc
.PHONY: all test clean
# 'all' and 'clean' are also phony
all: test
test: a
a: $(OBJS)
$(CC) $(CFLAGS) $(OBJS) -o a
b.o: b.c b.h
a.o: a.c b.h c.h
c.o: c.c c.h
clean:
rm a
rm *.o
我首先放置 all ,因此它是默认目标(这是常见的),删除了编译命令(make已经有内置),并更改了 FLAGS < / em>到 CFLAGS (这是C编译器标志的通用名称,由make的内置规则使用)。
答案 2 :(得分:2)
作为最后的手段,您可以在调试模式下运行Make(make -d)并梳理输出。在尝试之前,我建议您在“测试”规则中添加一行,以查看Make认为是否需要重建测试的任何先决条件(并在编译命令中使用一些自动变量,作为一种良好做法)。
test: $(OBJS)
@echo prereqs that are newer than test: $?
$(CC) $(FLAGS) $^ -o $@