永远重建

时间:2010-04-18 00:27:08

标签: makefile

我的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,没有做任何事情保存更改,一切正常。我认为这样做的日期戳是固定的。

3 个答案:

答案 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 $@