这是我的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
缩进clean
或rm
开头的文件。$(RM)
而不是rm
。但没有幸运答案 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
可执行文件,或者根本不调用目标。
在指定目标的情况下,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