我有一个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?
答案 0 :(得分:2)
似乎不应该发生。也许您应该仔细检查拼写错误。如果您的操作系统隐藏了您的文件扩展名,我会特别怀疑它。
答案 1 :(得分:2)
我无法重现您的问题。您可以尝试使用-d
选项运行make,以获得有关make尝试的详细历史记录。我最好的猜测是,由于某种原因,它正在寻找错误的目录。
答案 2 :(得分:0)
我认为由于没有生成名为target1
的可执行文件,因此您的目标target1
实际上将是虚假目标,并且将始终执行相应的命令。因此,无论如何都会编译您的代码
虽然我也无法重现你的问题:没有规则来制作目标`MyProg.cpp'