2014-09-25 101 views
1

依賴在項目中,我有:與Makefile文件,源發電機工作,產生與海灣合作委員會

  • main.cpp
  • template.sth

對於每個.cpp文件我生成.o文件。 感謝,我可以寫所有.o目標簡單規則(簡單,一點點pseudcode版本更加清晰):

OBJS = #list of all .o files needed 

%.o: %.cpp 
    g++ -MM -MF %.d -MP -MT %.o %.cpp 
    g++ -c -o %.o %.cpp 

話,我,包括所有現有.d文件,所以每一代人之後,我爽快的依賴。

它的工作除非我有template.sth。該文件包含一些用於生成h文件和cpp文件的模板。

當一個文件,即main.cpp包括從template.sth生成的文件(可以說gen.h):

  1. 指令產生.d文件不起作用,因爲gen.h丟失: fatal error: gen.h: No such file or directoryinclude "gen.h"
  2. 即使這些說明會起作用,這與我的「工作流程」有關。直到現在我可以生成.d文件進行下一次製作。它的工作原理是,因爲添加新的依賴關係需要更改當前依賴項之一。因此,在添加一個.o之後正在重建,並且生成了新的.d。現在我需要在製作.o之前檢測到,我需要從template.sth生成gen.h

有沒有辦法自動做到這一點?問題1可以解決,如果有一些方法可以告訴g++,如果某些.h文件丟失,只需將其添加到依賴項即可。 解決問題1.執行使多次(我三思而後行總是不夠),內置項目結束後(第一make會產生依賴文件,那麼第二make看到的是main.cpp取決於gen.hgen.h失蹤,有指導如何創建gen.h,以便在構建main.o之前創建gen.h)。

如果不能自動完成,怎麼解決?我可以在Makefile指令中編寫指令,這些指令將在任何其他版本之前構建所有生成的文件,或者我需要在所有.o指令中手動添加此生成的文件作爲依賴關係?

UPDATE:

一些改動後,與-MG標誌g++甚至gen.h生成正確的文件。我現在可以用兩個make命令來構建我的項目。 第一個將創建正確的.d文件並中斷,因爲缺少gen.h。 第二個將有.d文件準備好,所以它會在構建main.o之前生成gen.h,所以建築main.o將會成功。

是否有辦法生成.d文件然後在生成.o之前使用它?

回答

0

您需要添加依賴關係生成的文件:

gen.h: template.sth 
     ...command to create gen.h from template.sth 

如果你有大量生成的文件,你可能要自動創建這些依賴的方式,這將取決於你是如何生成它們。

此外,你想從.o文件獨立生成.d文件,並使用-MG標誌,同時產生他們忽略丟失的文件:

%.d: %.cpp 
     g++ -MM -MF [email protected] -MP -MG $< 

-include $(OBJS:.o=.d) 

這樣一來,你第一次運行時使,它將生成帶有依賴關係的.d文件,然後在嘗試構建其他任何內容之前重新讀取它們並重新計算所有依賴項。

+0

我有這個。問題是main.o和gen.h之間的Makefile沒有依賴關係。 – Ari 2014-09-25 18:00:55

+0

@Ari你正在尋找一種自動方式將'gen.h'添加到'main.o'的依賴列表中是否正確?請注意,目標文件依賴於它們包含的所有頭文件,所以像'main.o→gen.h'這樣的依賴關係應該在你的Makefile文件中生成'gen.h'文件。 – 2014-09-25 18:35:54

+0

@MichaelGrünewald是的,就像我添加未生成的依賴關係一樣。 – Ari 2014-09-25 18:38:12

相關問題