makefile中的依赖项

时间:2009-08-02 19:33:01

标签: dependencies makefile

我有一个makefile,一个片段看起来像这样(为了清晰起见,重命名了文件和目标):

target1 : OtherLib.o MyProg.h MyProg.cpp
    g++ -c ./MyProg.cpp -o $(BUILD_DIR)/MyProg.o

当我运行'make target1'时,我想让make检查MyProg.h和MyProg.cpp是否是最新的,如果没有则运行target1。但是,我收到了错误

make: *** No rule to make target `MyProg.cpp', needed by `target1'. Stop.

但'MyProg.cpp'是我正在尝试编译的内容!所以,我为它制作了一个空目标,如下:

MyProg.h :
MyProg.cpp :
target1 : OtherLib.o MyProg.h MyProg.cpp
    g++ -c ./MyProg.cpp -o $(BUILD_DIR)/MyProg.o

这有效,但看起来很奇怪。我的印象是,如果我只是这样做:

target1 : OtherLib.o
    g++ -c ./MyProg.cpp -o $(BUILD_DIR)/MyProg.o

然后将编译MyProg,无论它是否是最新的,因为MyProg.cpp未被列为依赖项。这样做的正确方法是什么,只有当MyProg.cpp和MyProg.h不是最新的时,make才会编译MyProg.o?

3 个答案:

答案 0 :(得分:2)

似乎不应该发生。也许您应该仔细检查拼写错误。如果您的操作系统隐藏了您的文件扩展名,我会特别怀疑它。

答案 1 :(得分:2)

我无法重现您的问题。您可以尝试使用-d选项运行make,以获得有关make尝试的详细历史记录。我最好的猜测是,由于某种原因,它正在寻找错误的目录。

答案 2 :(得分:0)

我认为由于没有生成名为target1的可执行文件,因此您的目标target1实际上将是虚假目标,并且将始终执行相应的命令。因此,无论如何都会编译您的代码 虽然我也无法重现你的问题:没有规则来制作目标`MyProg.cpp'