2015-08-18 34 views
1

如何使GNU make能夠在不修改目標文件(無配方主體)的情況下將目標視爲已修改的目標?MAKEFILE:在不修改文件的情況下將目標視爲已更新

我有頭文件,其中包含另一個頭文件。

program.h:

//include guard  

#include "dependencies.h" 

//some actual signatures 

和生成文件:

program: program.o dependencies.o 
    g++ -o program program.o dependencies.o 

program.o: program.cpp program.h 
    g++ -c program.cpp 

dependencies.o: dependencies.cpp dependencies.h 
    g++ -c dependencies.cpp 

program.h: dependencies.h 
    # I would like that this target was treated as modified after 
    # dependencies.h changes 

在當dependencies.h僅改變dependencies.o被重新編譯離開program.o原封不動,從而生成將上面的例子可能會失敗。有沒有可能改變這種行爲?

謝謝。

阿列克

+0

您的問題一般類似於:https://stackoverflow.com/questions/2394609/makefile-header-dependencies。這裏是另一個例子:http://scottmcpeak.com/autodepend/autodepend.html –

回答

4

更改這些行:

program.o: program.cpp program.h 
    g++ -c program.cpp 

dependencies.o: dependencies.cpp dependencies.h 
    g++ -c dependencies.cpp 

爲:

OBJ_FILES = program.o dependencies.o 
DEP_FILES = $(patsbust %.o,%.d,$(OBJ_FILES)) 

%.o : %.cpp 
    g++ -c $< -MP -MMD -MF $(@:.o=.d) -o [email protected] 

program : $(OBJ_FILES) 
    g++ -o [email protected] $^ 

-include $(DEP_FILES) 

這將對你g++自動生成您的相關文件(進入.d)文件。這些文件將具有用於依賴關係的makefile樣式規則。在這種情況下,我希望:

program.o : dependencies.h 

-include將這些添加到您的生成文件。這樣,您不必硬編碼您的依賴關係 - 讓編譯器爲您解決它!

1

讓你的程序取決於其依賴於全:

program.o: program.cpp program.h dependencies.h 
    g++ -c program.cpp 

當然,這是給你的program.o實際上依賴於dependencies.h。如果dependencies.hprogram.h的內部實現細節,那麼您的代碼應該編譯並鏈接,而不需要重新編譯program.o

+0

我這樣做就像你說的一樣,但如果存在更多的鏈接依賴關係,這是單調乏味的(並且它們不是實現細節,而是簽名fe)。我留下了這樣的行: 'main.o:myWindows.h myViewModels.h iMyView.h model.h $(DALINCLUDEDIR)/ $(DALHEADER)$(GUIINCLUDEDIR)/ $(GUIHEADER)$(SERVERINCLUDEDIR)/ $(SERVERHEADER)' – listerreg

+0

然後,也許巴里的自動化解決方案將幫助:) –

相關問題