我正在使用一个打算自动生成依赖项的makefile。但是对于我的文件,我发现虽然对头文件的更改导致代码被重新编译,但它们不会导致重新生成依赖关系,因为我认为应该这样做。谁能看到我错过的东西?
.SUFFIXES : .hpp .cpp .d .o
SOURCES=main.cpp sub1.cpp sub2.cpp
OBJECTS=${SOURCES:.cpp=.o}
DEPENDENCIES=${SOURCES:.cpp=.d}
.cpp.d:
g++ -MM $< > $@
.cpp.o:
g++ $< -c `pkg-config gtkmm-2.4 --cflags --libs` -g
calculator: ${OBJECTS} ${DEPENDENCIES}
g++ ${OBJECTS} -o calculator `pkg-config gtkmm-2.4 --cflags --libs` -g
include ${DEPENDENCIES}
答案 0 :(得分:1)
自己找到解决方案。诀窍也出现在official GNU make documentation。
中生成依赖项的行应如下所示:
.cpp.d:
g++ -MM $< | sed 's!^$(<:.cpp=.o):!$(<:.cpp=.o) $(<:.cpp=.d):!' > $@
sed将依赖行从“main.o:main.cpp include / hello.hpp”转换为“main.o main.d:main.cpp include / hello.hpp”(例如来自我的最小化测试)制作.d取决于与.o文件本身相同的文件。
虽然我个人建议使用例如SCons能够自动依赖跟踪,因为(根据我的经验)GNU make解决方案经常在引入新的头文件或重命名某些文件时中断。
答案 1 :(得分:1)
虽然我同意Dummy00001的解决方案,但可能有助于在g ++命令中添加-MP标志以生成依赖文件。它的作用是将PHONY目标与依赖项列表中所有头文件的名称相加。
即。如果g++ -MM $<
生成
test.o: test.cpp test.h dummy.h etc_bkp.h
然后g++ -MM -MP $<
生成
test.o: test.cpp test.h dummy.h etc_bkp.h
test.h:
dummy.h:
etc_bkp.h:
这有助于即使重命名或文件已被删除也不会破坏