"clean"在制作文件中不起作用

"clean" not working in make file

本文关键字:不起作用 文件 clean      更新时间:2023-10-16

这是我的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进行缩进
  • 目录中没有以CCD_ 3或CCD_
  • 尝试$(RM)而不是rm。但没有运气

我发现了这个问题。必须将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,触摸了一些伪.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

我在这里保存了固定版本,因为stackoverflow会混淆制表符/空白。请确保从RAW粘贴数据进行复制。


在更详细地阅读了问题、评论和你的自我回答后,我认为可能对make的传统用法有一些解释。

您可以调用带有要构建的目标列表的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应该导致调用clean目标。这是预期的make行为。

在我的情况下(在Windows上),我的make文件如下:

clean:
    rm *.o

当打开终端时,运行这个命令对我来说很好,所以我一开始认为这是我的makefile缩进的问题。

我意识到默认的Windows终端实际上是一个支持rm *.o的powershell窗口。但是,make-clean命令打开了一个不支持rm命令的cmd窗口。

我的解决方案最终将clean:部分变成了cmd for Windows支持的部分。最终结果是:

clean:
    del *.o

all:observer clean#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:observer修复为[all:observer clean]

2将rm-f*o观察器固定为[rm-f*.o]