gnu make rebuild 如果任何必要条件发生变化

gnu make rebuild if any of the requisites down the line changed

我目前 运行 在使用 gnu make 时遇到问题,我在 makefile 中进行了以下设置:(仅重要的部分)

all: bin/game

bin/game: obj/main.o
    gcc -o bin/game obj/main.o

obj/main.o: src/main.cpp
    gcc -c src/main.cpp -o obj/main.o

# Don't do anything, just make sure that library.hpp hasn't changed
src/main.cpp: include/library.hpp

# Don't do anything, just make sure that part1 and part2 haven't changed
include/library.hpp: include/library/part1.hpp\
                     include/library/part2.hpp

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

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

我注意到将 include/library.hpp 移动到 obj/main.o 要求解决了这个特定问题,尽管当 include/library/part1.hppinclude/library/part2.hpp 是变了。

有没有办法像我在这里所做的那样将食谱分成 'levels' 以使事情更有条理而不是将它们全部列在一个目标中?

src/main.cpp: include/library.hpp 告诉 make 在 include/library.hpp 改变时重建 src/main.cpp。这是不正确的,因为您构建的是 obj/main.o。修复:

obj/main.o : include/library.hpp

接下来,由于你没有构建include/library.hppsrc/main.cpp,它们的依赖关系是无用的。修复:

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

实际上,您不希望自己指定 header 依赖项,因为那很乏味而且 error-prone。编译器可以为您做到这一点:

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 依赖的所有文件。

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