Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ &引用;“干净”;不在make文件中工作_C++_Makefile_Make - Fatal编程技术网

C++ &引用;“干净”;不在make文件中工作

C++ &引用;“干净”;不在make文件中工作,c++,makefile,make,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

这是我的制作文件

 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
    。它很好用
  • 我使用了缩进的
    选项卡
  • 目录中没有以
    clean
    rm
    开头的文件
  • 尝试了
    $(RM)
    而不是
    RM
    。但不走运

正如其他人所提到的,这可能是一个缩进问题。我准确地复制了您的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
$ 
我所做的具体缩进修复是:

  • 目标行不应该有任何前导空格
  • 配方行必须仅以一个选项卡开始,并且不能有其他空格
例如:

我保存了固定版本,因为stackoverflow会弄乱制表符/空格。确保从原始粘贴数据中复制


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

您可以使用要构建的目标列表调用
make
可执行文件,也可以不调用任何目标

如果指定了目标,make将尝试构建/重建这些目标。例如,使用修改后的Makefile,
makeobserver
将构建
observer
目标(
observer
可执行文件),
makemain.o
将简单地编译main.cpp以生成main.o,
makeclean
将调用
clean
规则以删除列出的文件


另一方面,如果在没有目标的情况下调用
make
,那么make将只使用Makefile中定义的第一个目标作为它构建的目标。惯例是这个目标被称为
all
,但它可以被任意调用。因此,对于已更正的makefile,调用
make
而不显式传递任何目标应导致
all
及其依赖关系
observer
被重建。我怀疑这就是产生混淆的地方——为这个没有明确提到目标的makefile调用
make
,应该not会导致调用
clean
目标。这是预期的
make
行为。

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

all:[你的高管姓名]干净

在上述情况下

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
全部:观察员清洁#1

1将所有:观察者修复为[所有:观察者清理]
2将rm-f*o观察者固定到[rm-f*.o]缩进在Makefiles中是至关重要的。另外,您不需要
.o
目标,隐式规则会为您创建它们。@bstamour:不走运,不适用于
rm-f*.o observer
您是否尝试过
清理
?输出结果是什么?您发布的示例中的缩进错误。确保它反映了你所拥有的。如果是这样,您需要修复Makefile中的缩进。您最终是否尝试了
。假冒:clean
?在所有规则中删除这个(意外的?)缩进,除了
all
?很抱歉,这不起作用。与make文件的结果相同。建造精细,但不清洁。我在Fedora工作,可能是Fedora的问题吗?Fedora使用标准的Makefile。一旦格式正确,它就会起作用。@Nayanadassuriya请查看我的更新答案和对您答案的评论。这违反了普遍接受的makefile约定。这意味着在没有明确目标的情况下调用
make
将导致重建
observer
clean
目标,这可能不是您想要的。您必须显式地调用
makeobserver
来构建观察者,而无需调用
clean
您不应该在编译后删除对象文件。如果它们困扰您,请直接将它们编译到一个隐藏文件夹中。更糟糕的是,虽然
observer
clean
都是
all
的依赖项,但无法保证它们的重建顺序-事实上,如果使用大于1的-j,它们可以同时运行。@digitaltrampion,谢谢你的解释。实际上,我需要做的是当我调用
make-f makefileName
final target时,需要构建并删除所有中间文件。为此,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
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