C Makefile不删除中间文件
我的C Makefile不删除中间文件,c,makefile,gnu-make,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 $@
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
有什么问题?有关.INTERMEDIATE
的角色,请参阅
你可能是说
.SECONDARY: $(OBJECTS)
因为我认为如果你把.INTERMEDIATE
放进去,那么对象就会被移除,而你可能不希望这样。我认为你不能有意义地把%.o
作为特殊目标的先决条件
我建议保留对象文件,这样就不会浪费时间重新编译它们
运行一次make-p
会教你很多make
知道的规则
使用remake-x
(即)非常有用,至少对于调试复杂的Makefile
-s是非常有用的。您也可以使用make-d
,但我觉得它太冗长了
您可能希望使用比
make
更好的构建器,例如,据我所知,。
不应删除已经存在的中间文件。这来自gnu make的文档:
与所有其他文件一样,使用中间文件的规则重新生成中间文件。但中间文件的处理方式有两种
第一个区别是如果中间文件不存在会发生什么。如果普通文件b不存在,并且make考虑依赖于b的目标,则它总是创建b,然后从b更新目标。但是,如果b是一个中间文件,那么make就可以很好地保留它。它不会费心更新b或最终目标,除非b的某些先决条件比该目标更新,或者有其他原因更新该目标
第二个区别是,如果make创建b是为了更新其他内容,那么它会在不再需要b之后删除b。因此,在make之前不存在的中间文件在make之后也不存在。通过打印“rm-f”命令向您报告删除操作,显示要删除的文件
因此,在运行make之前,请确保目录中没有
*.o
。特殊目标.INTERMEDIATE
不能使用%
通配符。试试这个:
.INTERMEDIATE: stack.o prefixer.o
附带问题:我不知道
.INTERMEDIATE
,但我能问一下您为什么要这样做吗?Makefile很好,因此您可以避免重建源未被触及的.o
文件。如果每次都要重建所有内容,为什么不使用脚本呢?您错过了依赖项prefixer.c
->prefixer.o
@BasileStarynkevitch这是什么意思?这是第二个prefixer.o:stack.h….
是的,在Makefile
第9行中应该有prefixer.o:prefixer.c stack.h
,但这没有任何作用,是吗?.SECONDARY$(对象)
会做什么?我想清理目录中的混乱,因此使用.INTERMEDIATE
。其次,如果源代码被修改,我将如何让它重新编译?有什么想法吗?如果你不做任何特殊的目标技巧,*.o
被构建并保存在目录中(因为make
处理可传递的依赖项),并且make
将适当地重新编译。当然,您需要提供源->对象依赖项。出于某种原因,当我更改一个源文件,并再次运行make
时,它会显示prefixer
是最新的。。当它不是的时候。我错过了什么?我认为此“功能”默认为make
,不需要任何额外命令。根据您的要求,您可以使用%.o
作为特殊目标.PRECIOUS
的先决条件.PRECIOUS
的作用与.SECONDARY
一样,差别很小。