Dependencies makefile中的依赖项

Dependencies makefile中的依赖项,dependencies,makefile,Dependencies,Makefile,我有一个makefile,其中一个片段如下所示(为了清晰起见,重命名了文件和目标): 目标1:OtherLib.o MyProg.h MyProg.cpp g++-c./MyProg.cpp-o$(BUILD\u DIR)/MyProg.o 当我运行“make target1”时,我希望make检查MyProg.h和MyProg.cpp是否是最新的,如果不是,则运行target1。然而,我得到了错误 make: *** No rule to make target `MyProg.cpp', n

我有一个makefile,其中一个片段如下所示(为了清晰起见,重命名了文件和目标):

目标1:OtherLib.o MyProg.h MyProg.cpp g++-c./MyProg.cpp-o$(BUILD\u DIR)/MyProg.o 当我运行“make target1”时,我希望make检查MyProg.h和MyProg.cpp是否是最新的,如果不是,则运行target1。然而,我得到了错误

make: *** No rule to make target `MyProg.cpp', needed by `target1'. Stop. make:**target1不需要将目标设置为“MyProg.cpp”的规则。停止 但是‘MyProg.cpp’是我试图编译的!所以,我为它设定了一个空目标,如下所示:

MyProg.h : MyProg.cpp : target1 : OtherLib.o MyProg.h MyProg.cpp g++ -c ./MyProg.cpp -o $(BUILD_DIR)/MyProg.o MyProg.h: MyProg.cpp: 目标1:OtherLib.o MyProg.h MyProg.cpp g++-c./MyProg.cpp-o$(BUILD\u DIR)/MyProg.o 这是可行的,但看起来很奇怪。我的印象是,如果我只是这样做:

target1 : OtherLib.o g++ -c ./MyProg.cpp -o $(BUILD_DIR)/MyProg.o target1:OtherLib.o g++-c./MyProg.cpp-o$(BUILD\u DIR)/MyProg.o
然后,不管MyProg是否是最新的,都将编译MyProg,因为MyProg.cpp未作为依赖项列出。只有在MyProg.cpp和MyProg.h不是最新的情况下,make才编译MyProg.o,这样做的正确方法是什么?

似乎不应该这样做。也许你应该仔细检查拼写错误。如果你的操作系统对你隐藏文件扩展名,我会特别怀疑。

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

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

我无法重现您的问题。您可以尝试使用
-d
选项运行make,以获得make尝试执行的操作的详细历史记录。我的最佳猜测是,出于某种原因,它在错误的目录中查找。

我认为,由于没有生成名为
target1
的可执行文件,因此您的target
target1
实际上是一个假目标,并且始终会执行相应的命令。因此,您的代码在任何情况下都将被编译。

虽然我也无法重现您的问题:没有规则将目标设置为“MyProg.cpp”

我认为,由于没有生成名为
target1
的可执行文件,因此您的目标
target1
实际上将是一个虚假目标,并且始终会执行相应的命令。因此,您的代码在任何情况下都将被编译。

尽管我也无法重现您的问题:没有规则将目标'MyProg.cpp'作为快乐编译的黄金法则-永远不要使用大小写混合的文件名。或者使用带空格的文件名或文件夹。导致命令行解析出现很多问题。我快乐编译的金科玉律——永远不要使用大小写混合的文件名。或者使用带空格的文件名或文件夹。导致命令行解析出现很多问题。 target1 : OtherLib.o g++ -c ./MyProg.cpp -o $(BUILD_DIR)/MyProg.o