"清洁"不在make文件中工作

时间:2014-09-02 15:39:15

标签: c++ makefile

这是我的make文件。

 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。但没有幸运

3 个答案:

答案 0 :(得分:5)

我发现了这个问题。必须指定clean作为all的目标,否则它不会打电话。一般都是这样的。

all: [your executive names] clean

在上述情况

all: observer clean

以下是上述案例的完整make文件

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

答案 1 :(得分:3)

正如其他人所说,这可能是一个缩进问题。我完全复制了你的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
$ 

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

  • 目标行不应该包含任何前导空格
  • 配方行必须以一个选项卡开头,而不是其他空格

E.g:

clean:
    rm -f  *o observer

我保存了固定版本here,因为stackoverflow与标签/空格混淆。请务必从 RAW粘贴数据

进行复制

在更详细地阅读了问题,评论和你的自我答案之后,我认为可能会对的常规用法做一些解释。

您可以使用要构建的目标列表调用make可执行文件,或者根本不调用目标。

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

另一方面,如果你调用没有目标的clean,那么make将只使用Makefile中定义的第一个目标作为它构建的目标。惯例是这个目标被称为make,但它可以被调用,无论你喜欢什么。因此,对于更正后的makefile,在未显式传递任何目标的情况下调用all应导致make并重建其依赖项all。我怀疑这是出现混淆的地方 - 如果 导致调用observer,则为此makefile调用make而没有明确提及的目标目标。这是预期的clean行为。

答案 2 :(得分:0)

全部:观察者清洁#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修复all:观察者到[all:observer clean]

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