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.hpp
、include/library/part2.hpp
甚至 include/library.hpp
,它不会重建 bin/game
,即使它依赖于它。
是不是因为make忽略了src/main.cpp的必要条件,因为它本身没有改变?
我注意到将 include/library.hpp
移动到 obj/main.o
要求解决了这个特定问题,尽管当 include/library/part1.hpp
或 include/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.hpp
或src/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
不会失败)。在后续构建中,它使用前一个构建生成的依赖项来决定需要重建的内容。
我目前 运行 在使用 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.hpp
、include/library/part2.hpp
甚至 include/library.hpp
,它不会重建 bin/game
,即使它依赖于它。
是不是因为make忽略了src/main.cpp的必要条件,因为它本身没有改变?
我注意到将 include/library.hpp
移动到 obj/main.o
要求解决了这个特定问题,尽管当 include/library/part1.hpp
或 include/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.hpp
或src/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
不会失败)。在后续构建中,它使用前一个构建生成的依赖项来决定需要重建的内容。