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
$ 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
$
我所做的具体缩进修复是:
- 目标行不应该有任何前导空格
- 配方行必须仅以一个选项卡开始,并且不能有其他空格
在更详细地阅读了这个问题、评论和你的自我回答之后,我认为可能有一些关于传统用法的解释 您可以使用要构建的目标列表调用
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