2011-09-19 65 views
0

我能做些什么来解决这个问题?我是emacs,Unix和makefile的新手。请解释我做错了什么,以及我如何解决它。我敢肯定,这是一个简单的问题问题与我的简短的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 

回答

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.cppyesno.o,但需要有关标题的额外信息。

这只应该重新编译guess.o当只有guess.cpp更改;当yesno.cpp改变时,它应该只重新编译yesno.o;它应该在yesno.h更改时重新编译这两个对象文件。如果任何源文件发生更改,程序将重新链接;如果没有源文件更改,那么make命令应该什么都不做(或者只是报告没有任何事情要做)。

+0

非常感谢!问题解决了,也要感谢一个彻底的解释。 – Sam