Makefile依赖关系生成不检查标头

时间:2010-07-16 09:05:59

标签: linux makefile

我正在使用一个打算自动生成依赖项的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}

2 个答案:

答案 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:

这有助于即使重命名或文件已被删除也不会破坏