Makefile不删除中间文件

时间:2012-07-29 13:02:49

标签: c makefile gnu-make

我的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有什么问题?

3 个答案:

答案 0 :(得分:8)

请参阅Gnu make special targets了解.INTERMEDIATE

的角色

你可能意味着

 .SECONDARY:  $(OBJECTS)

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

我建议保留目标文件,这样就不会浪费时间重新编译它们。

运行一次make -p会教会你很多make了解的规则。

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

您可能希望使用比make更好的构建器,例如omake

答案 1 :(得分:5)

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

.INTERMEDIATE: stack.o prefixer.o

答案 2 :(得分:0)

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

  

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

     

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

     

第二个区别是,如果make确实创建了b以便更新其他东西,那么它会在不再需要之后删除b。因此,make之后不存在的中间文件也不存在。通过打印'rm -f'命令向您报告删除信息,该命令显示正在删除的文件。

因此,在运行make之前,请确保目录中没有*.o