我的短Unix Makefile问题

时间:2011-09-19 03:13:25

标签: unix makefile

我该怎么做才能解决这个问题?我是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

1 个答案:

答案 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命令就什么都不做(或者只是报告没有任何事情可做)。