【问题标题】:Makefile how to not remove one specific object file while remove all other object files and executable files?Makefile 如何在删除所有其他目标文件和可执行文件时不删除一个特定的目标文件?
【发布时间】:2018-11-08 18:19:51
【问题描述】:

现在我有这个命令:rm -f *.x *.o,它通过在我的 shell 中调用 make clean 来删除所有的目标文件和可执行文件。但是我有一个特定的目标文件,比如a.o,我不想删除它。我怎么能在不硬编码的情况下做到这一点?请注意,我只能在 C90 下实现它,因为这是一个作业。

【问题讨论】:

  • 这在 GNU make 中相对容易,但在传统 Makefile 中具有挑战性。你能接受一个仅限 GNU 的答案吗?
  • 您使用的 C 编译器与这里完全无关。
  • @tripleee 我在这里调用“make clean”来删除所有文件。您链接的问题是关于编译的。
  • 您在通配符之前放置的哪个命令绝对没有相关性;只需输入rm 而不是gcc。牛肉是如何创建一个排除一个文件的表达式。您会注意到没有一个答案说明编译。

标签: shell makefile


【解决方案1】:

首先,不要在clean: 规则(或任何其他规则)中发出通配符删除命令。当用户键入make clean 时,他们可能会丢失甚至不受构建系统控制的文件。您的构建系统应该只清理它构建的内容。 (也就是说,至少具有“常规强度”clean 目标;这里我们应该承认提供额外目标以删除编辑器备份文件、tags、生成的配置材料等的普遍做法。)

目标文件应列在$(OBJS) 等变量中,并应使用rm -f ... $(OBJS) 删除。

如果某个目标文件不被删除,可以分东西:

DISPOSABLE_OBJS = ...
PRECIOUS_OBJS = ...
OBJS = $(DISPOSABLE_OBJS) $(PRECIOUS_OBJS)

然后在clean 规则中,只需删除$(DISPOSABLE_OBJS)

在 GNU Make 中,您拥有额外的灵活性,例如 rm -f $(filter-out keep1.o keep2.o,$(OBJS)) 可以删除除 keep1.okeep2.o 之外的所有 $(OBJS)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-21
    • 2010-10-26
    • 1970-01-01
    • 2021-03-03
    相关资源
    最近更新 更多