【问题标题】:Makefile not deleting intermediate filesMakefile 不删除中间文件
【发布时间】:2012-07-29 13:02:48
【问题描述】:

我的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,但我能问一下你为什么要这样做吗? Makefile 很好,因此您可以避免重建源未触及的.o 文件。如果你想每次都重新构建,为什么不直接使用脚本呢?
  • 你错过了依赖prefixer.c -> prefixer.o
  • @BasileStarynkevitch 你是什么意思?第二个prefixer.o: stack.h ....
  • 是的,您的Makefile 第 9 行中应该有 prefixer.o : prefixer.c stack.h

标签: c makefile gnu-make


【解决方案1】:

查看Gnu make special targets.INTERMEDIATE的角色

你可能是说

 .SECONDARY:  $(OBJECTS)

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

我建议保留目标文件,以免浪费时间重新编译它们。

跑一次make -p会教你很多make知道的规则。

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

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

【讨论】:

  • 但这没有任何作用,不是吗? .SECONDARY $(OBJECTS) 会做什么?我想清理目录中的杂乱,因此使用.INTERMEDIATE。其次,如果源已被修改,我将如何让重新编译?有什么想法吗?
  • 如果你不做任何特殊的目标技巧,*.o 被构建并保存在目录中(因为make 确实处理传递依赖),make 将适当地重新编译。当然你需要给 source -> object 依赖。
  • 出于某种原因,当我更改其中一个源文件并再次运行make 时,它说prefixer 是最新的.. 当它不是。我在这里想念什么?我认为这个“功能”默认为make,不需要任何额外的命令。
  • 根据gnu.org/software/make/manual/html_node/Chained-Rules.html,您可以使用%.o作为特殊目标.PRECIOUS的先决条件。 .PRECIOUS 的行为与 .SECONDARY 相同,只是略有不同。
【解决方案2】:

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

.INTERMEDIATE: stack.o prefixer.o

【讨论】:

    【解决方案3】:

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2020-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多