2010-07-16 45 views
1

我正在使用打算自动生成依赖关系的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 $< > [email protected] 
.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

这是棘手。我会等待profi回应。问题的关键(显然).d依赖于.cpp,并忽略头文件的更改。所以从某种意义上说,.d必须依赖于.d ....依赖性是我不使用make的所有原因之一。 – Dummy00001 2010-07-16 10:57:32

回答

1

我自己找到解决方案。技巧也出现在official GNU make documentation

产生依赖性应该看起来像行:

.cpp.d: 
     g++ -MM $< | sed 's!^$(<:.cpp=.o):!$(<:.cpp=.o) $(<:.cpp=.d):!' > [email protected] 

桑达从翻译的依赖行“main.o:main.cpp中包括/ hello.hpp”到“main.o为主。 d:main.cpp include/hello.hpp“(例如我最小化的测试),因此.d依赖于与.o文件本身相同的文件。

虽然我个人建议使用例如SCons这是能够自动依赖性跟踪,因为(根据我的经验),当引入新的头文件或重命名某些文件时,GNU make解决方案经常会中断。

+0

谢谢,Dummy00001。这似乎已经成功了。 – 2010-07-16 11:30:20

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: 

这将有助于作出不予打破即使重命名完成或文件已被删除

+0

谢谢vamsi。我会研究一下。 – 2011-05-23 07:36:13