【问题标题】:"clean" not working in make file“干净”在make文件中不起作用
【发布时间】:2014-09-02 15:39:14
【问题描述】:

这是我的制作文件。

 all: observer

    observer: main.o weather_center.o display.o subject.o observer.o
         g++ main.o weather_center.o display.o subject.o observer.o -o observer

    main.o: main.cpp
        g++ -c main.cpp

    weather_center.o: weather_center.cpp
        g++ -c weather_center.cpp

    display.o: display.cpp
        g++ -c display.cpp

    subject.o: subject.cpp
        g++ -c subject.cpp

    observer.o: observer.cpp
        g++ -c observer.cpp

    clean:
        rm -f  *o observer

这里我尝试使用

clean:
        rm -f  *o observer

清理临时 *.o 文件。但程序编译并生成目标程序集,但不会删除 *.o 文件。也没有显示任何错误。

  • 我在终端中尝试了rm -f *o observer。效果很好。
  • 我使用Tab 进行缩进
  • 目录中没有以cleanrm开头的文件。
  • 尝试$(RM) 而不是rm。但没有运气

【问题讨论】:

  • 缩进在 Makefile 中至关重要。此外,您不需要 .o 目标,隐式规则将为您制作它们。
  • @bstamour:不走运,不适用于rm -f *.o observer
  • 你试过make clean吗?输出是什么?
  • 您发布的示例中的缩进错误。确保它反映了你所拥有的。如果是这样,您需要修复 Makefile 中的缩进。
  • 你最终尝试了.PHONY: clean 吗?并在除all 之外的所有规则中删除此(意外?)缩进?

标签: c++ makefile


【解决方案1】:

我发现了问题。必须将clean 指定为all 的目标,否则它不会调用。一般是这样的。

all: [your executive names] clean

以上情况

all: observer clean

这是上述案例的完整制作文件

all: observer clean

observer: main.o weather_center.o display.o subject.o observer.o
    g++ main.o weather_center.o display.o subject.o observer.o -o observer

main.o: main.cpp
    g++ -c main.cpp

weather_center.o: weather_center.cpp
    g++ -c weather_center.cpp

display.o: display.cpp
    g++ -c display.cpp

subject.o: subject.cpp
    g++ -c subject.cpp

observer.o: observer.cpp
    g++ -c observer.cpp

clean:
    rm -f  *o observer

【讨论】:

  • 这违背了普遍接受的 makefile 约定。这意味着在没有明确目标的情况下调用make 将导致observerclean 目标都被重建,这可能不是您想要的。您必须明确调用 make observer 来构建观察者而不调用 clean
  • 编译后不要删除目标文件。如果他们打扰你,直接在一个隐藏的文件夹中编译它们。
  • 更糟糕的是,虽然 observerclean 都是 all 的依赖项,但无法保证它们将按照哪个顺序重建 - 事实上,如果你使用大于 1 的 -j。
  • @DigitalTrauma,+1 谢谢你的解释。实际上我需要做的是当我调用 make -f makefileName 时,最终目标需要构建和删除所有中间文件。为此,make 文件应该如何以及如何运行它?
【解决方案2】:

正如其他人所提到的,这可能是一个缩进问题。我完全复制了您的 makefile,触摸了一些虚拟 .o 文件并运行它:

$ touch main.o weather_center.o display.o subject.o observer.o
$ make clean
Makefile:4: *** missing separator (did you mean TAB instead of 8 spaces?).  Stop.
$ 

修复缩进后,它对我来说似乎工作得很好:

$ touch main.o weather_center.o display.o subject.o observer.o
$ ls *.o
display.o  main.o  observer.o  subject.o  weather_center.o
$ make clean
rm -f  *o observer
$ ls *.o
ls: cannot access *.o: No such file or directory
$ 

我所做的具体缩进修复是:

  • 目标行根本不应有任何前导空格
  • 配方行必须以一个制表符开头,并且不能有其他空格

例如:

clean:
    rm -f  *o observer

我已经保存了固定版本here,因为 stackoverflow 与制表符/空格混淆。确保从 RAW 粘贴数据复制。


更详细地阅读了问题、cmets 和您的自我回答后,我认为可能需要对 的常规用法进行一些解释。

您可以调用make 可执行文件,其中包含要构建的目标列表,或者根本没有目标。

在指定目标的情况下,make 将尝试构建/重建这些目标。例如,使用更正后的 Makefile,make observer 将构建 observer 目标(observer 可执行文件),make main.o 将简单地编译 main.cpp 以生成 main.o,make clean 将调用 clean删除列出的文件的规则。

另一方面,如果您在没有目标的情况下调用make,则 make 将简单地使用 Makefile 中定义的第一个目标作为它构建的目标。约定是这个目标被称为all,但它可以被称为任何你喜欢的。因此,对于更正的 makefile,调用 make 而不显式传递任何目标应该会导致 all 及其依赖关系 observer 被重建。我怀疑这是引起混淆的地方 - 为这个没有明确提及目标的 makefile 调用 make 应该 not 导致调用 clean 目标。这是预期的make 行为。

【讨论】:

  • 很抱歉,这不起作用。结果与我的 make 文件相同。建得很好,但不清洁。我在 Fedora 工作,这可能是 Fedora 的任何问题吗?
  • Fedora 使用标准的 Makefile。一旦格式正确,它将起作用。
  • @NayanaAdassuriya 请查看我的更新答案并对您的答案发表评论。
【解决方案3】:

所有:观察者清洁 #1

observer: main.o weather_center.o display.o subject.o observer.o
     g++ main.o weather_center.o display.o subject.o observer.o -o observer

main.o: main.cpp
    g++ -c main.cpp

weather_center.o: weather_center.cpp
    g++ -c weather_center.cpp

display.o: display.cpp
    g++ -c display.cpp

subject.o: subject.cpp
    g++ -c subject.cpp

observer.o: observer.cpp
    g++ -c observer.cpp

clean:
    rm -f  *.o #2

1 修复所有:观察者到 [所有:观察者清洁]

2 将 rm -f *o 观察者修复为 [rm -f *.o]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-07
    • 1970-01-01
    相关资源
    最近更新 更多