3

Makefile没有删除中间文件。我已经设置了.INTERMEDIATE。这是我的Makefile:

OBJECTS=prefixer.o stack.o
CFLAGS=-Werror -Wmissing-prototypes -g
LIBS=-lm
CC=gcc

prefixer : $(OBJECTS)
    $(CC) -o prefixer $(OBJECTS) $(LIBS)

prefixer.o : stack.h
    $(CC) -c prefixer.c -o $@ $(CFLAGS)
stack.o : stack.c stack.h
    $(CC) -c stack.c -o $@ $(CFLAGS)

.INTERMEDIATE: %.o

.PHONY: clean
clean : 
    -rm prefixer *.o

有什么问题.INTERMEDIATE

4

3 回答 3

8

请参阅Gnu为角色制作特殊目标.INTERMEDIATE

你大概是说

 .SECONDARY:  $(OBJECTS)

因为我认为如果你放.INTERMEDIATE了那么对象总是会被删除,你可能不希望这样。我认为你不能有意义地把%.o它作为特殊目标的先决条件。

我建议保留目标文件,以免浪费时间重新编译它们。

跑一次make -p会教你很多知道的规则make

使用remake -x (即remake)非常有帮助,至少可以调试复杂的Makefile-s。你也可以使用make -d,但我觉得它太冗长了。

您可能希望使用比 omake 更好的make构建

于 2012-07-29T13:11:08.780 回答
4

特殊目标.INTERMEDIATE不适用于%通配符。尝试这个:

.INTERMEDIATE: stack.o prefixer.o
于 2012-07-29T13:14:20.227 回答
0

据我了解,.INTERMEDIATE如果中间文件已经存在,则不应该删除它。这是来自 gnu make 的文档:

就像所有其他文件一样,使用它们的规则重新制作中间文件。但是中间文件有两种不同的处理方式。

第一个区别是如果中间文件不存在会发生什么。如果一个普通文件 b 不存在,并且 make 考虑一个依赖于 b 的目标,它总是创建 b 然后从 b 更新目标。但是如果 b 是一个中间文件,那么 make 就可以不用管它了。它不会打扰更新 b 或最终目标,除非 b 的某些先决条件比该目标更新或有其他原因更新该目标。

第二个区别是,如果 make 确实创建 b 以更新其他内容,它会在不再需要 b 后删除它。因此,在 make 之前不存在的中间文件在 make 之后也不存在。make 通过打印“rm -f”命令向您报告删除情况,该命令显示正在删除的文件。

所以在运行make之前确保目录中没有*.o

于 2012-07-29T13:13:06.420 回答