Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C Makefile不删除中间文件_C_Makefile_Gnu Make - Fatal编程技术网

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
一样,差别很小。