Makefile 如果行中的任何必要条件发生更改,gnu将进行重建

Makefile 如果行中的任何必要条件发生更改,gnu将进行重建,makefile,gnu-make,Makefile,Gnu Make,我目前在使用gnumake时遇到了一个问题,我在makefile中有以下设置:(仅适用于重要的部分) 在这个长长的需求螺旋中,在实际项目中有更多的目标文件、源文件和头文件,尽管当我更新src/main.cpp、更新include/library/part1.hpp、include/library/part2.hpp甚至include/library.hpp时,它会重建bin/game,它不会重建bin/game,即使它依赖于它 是因为make忽略了src/main.cpp的必要条件,因为它本身没

我目前在使用gnumake时遇到了一个问题,我在makefile中有以下设置:(仅适用于重要的部分)

在这个长长的需求螺旋中,在实际项目中有更多的目标文件、源文件和头文件,尽管当我更新src/main.cpp、更新
include/library/part1.hpp
include/library/part2.hpp
甚至
include/library.hpp
时,它会重建
bin/game
,它不会重建
bin/game
,即使它依赖于它

是因为make忽略了src/main.cpp的必要条件,因为它本身没有改变吗

我注意到,将
include/library.hpp
移动到
obj/main.o
requisites修复了这个特殊的问题,尽管当
include/library/part1.hpp
include/library/part2.hpp
被更改时,它仍然不会更新


有没有一种方法可以像我在这里所做的那样将菜谱划分为“级别”以使事情更有条理,而不是将它们全部列在一个目标中?
src/main.cpp:include/library.hpp
include/library.hpp
发生变化时告诉make重建
src/main.cpp
。这是不正确的,因为您构建的是
obj/main.o
。修正:

obj/main.o : include/library.hpp

接下来,由于您不构建
include/library.hpp
src/main.cpp
,因此它们的依赖关系是无用的。修正:

obj/main.o : include/library.hpp include/library/part1.hpp include/library/part2.hpp

在实践中,您不希望自己指定头依赖项,因为这很繁琐且容易出错。编译器可以为您执行以下操作:

obj/main.o: src/main.cpp
    gcc -c src/main.cpp -o obj/main.o -MD -MP
-include obj/main.d # produced by -MD -MP
然后用
src/main.cpp:…
include/library.hpp:…
删除这些行

您可以检查
obj/main.d
并查看所有文件
obj/main.o
所依赖的文件


在第一次构建时,您不需要标题依赖项,因为它必须构建所有内容(
-include obj/main.d
如果
obj/main.d
不存在,则不会失败)。在后续版本中,它使用上一个版本生成的依赖项来决定需要重建的内容。

谢谢,我想我已经理解了,我事先不知道.d文件,所以我想我必须手动键入每个依赖项,我想通过将其扩展到各个目标来缓解这一问题,但这更有效。
obj/main.o: src/main.cpp
    gcc -c src/main.cpp -o obj/main.o -MD -MP
-include obj/main.d # produced by -MD -MP