是什么导致Make删除中间文件?

z.h*_*.h. 11 make

我写了一个Makefile,发现在执行make命令时,rm在Mmakefile中的所有命令都完成后执行了一个意外。但是我没有rm在Makefile中写命令。

run-%: d/%.out
    $<

d/%.out: d/%.c
    gcc -o $(subst .c,.out,$<) $<
Run Code Online (Sandbox Code Playgroud)

运行输出make run-a

gcc -o d/a.out d/a.c
d/a.out
rm d/a.out
Run Code Online (Sandbox Code Playgroud)

注意rm d/a.out我没有写的尾随。

什么情况下会rm添加自动命令?

Kus*_*nda 10

当您这样做时make run-a,该文件d/a.out是由中间目标( 的依赖项run-a)创建的,当主目标 ( run-a) 已构建并且不再需要该中间目标的结果时,该文件将被删除。

您可以d/a.out通过将其声明为“宝贵的”来防止删除:

.PRECIOUS: d/%.out
Run Code Online (Sandbox Code Playgroud)

另请参阅GNU Make 手册中的“隐式规则链”

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

第一个区别是 [...]

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

  • @ThrowAwayAccount GNU git 存储库(GNU Make 版本 1)中可用的最早版本在 1988 年就有这种行为:https://git.savannah.gnu.org/cgit/make.git/tree/make.texinfo?h=Release1 #n3018 (7认同)