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