我该怎么做才能解决这个问题?我是emacs,Unix和makefile的新手。请解释我做错了什么,以及如何解决它。我确定这是一个简单的问题
progA: yesno.h yesno.cpp
g++ -DDEBUG -c yesno.cpp yesno.h
progB: guess.cpp
g++ -DDEBUG -c guess.cpp
progC: yesno.o guess.o
g++ -DDEBUG -o guess guess.o yesno.o
我的错误是:
Your makefile does too much work when only guess.cpp has been changed:
g++ -c yesno.cpp yesno.h
g++ -c guess.cpp
g++ -o guess guess.o yesno.o
答案 0 :(得分:2)
你的makefile每次都会重新编译。
你不需要前四行; make
知道如何从源创建目标文件。或者,您需要将这4行修改为2,并将它们放在最后,并更改目标名称:
guess: yesno.o guess.o
g++ -o guess yesno.o guess.o
guess.o: yesno.h
yesno.o: yesno.h
第一个目标是默认构建的目标,因此可确保构建guess
(程序)。命令行省略-DDEBUG
,因为它只影响源代码编译,并且该链接行中没有源代码(但是,如果在高级makefile
中使用宏,我会没事的-DDEBUG
等选项出现在链接行中。
第三行表示guess.o
取决于yesno.h
;这是一个猜测(就我而言)。 make
计划已经知道如何将guess.cpp
转换为guess.o
;它只需要额外的信息,它也使用yesno.h
标题。 (如果没有,它如何知道yesno.cpp
中定义的函数?)
最后一行表示yesno.o
取决于yesno.h
;再次,make
知道如何将yesno.cpp
编译为yesno.o
,但需要有关标题的额外信息。
仅在guess.o
更改时才应重新编译guess.cpp
;它只应在yesno.o
更改时重新编译yesno.cpp
;它应该在yesno.h
更改时重新编译这两个目标文件。如果任何源文件发生更改,程序将重新链接;如果没有源文件发生变化,那么make
命令就什么都不做(或者只是报告没有任何事情可做)。