簡體   English   中英

使用Makefile,源生成器並使用gcc生成依賴項

[英]Working with Makefile, source generators and generating dependencies with gcc

在項目中,我有:

  • 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. 由於缺少gen.h ,指令生成的.d文件不起作用: fatal error: gen.h: No such file or directory include "gen.h"
  2. 即使這些說明有效,我的“工作流程”還是有問題。 到目前為止,我可以為下一個生成.d文件。 它起作用了,因為添加新的依賴項需要更改當前的依賴項之一。 因此,添加一個.o后將進行重建並生成新的.d 現在,我需要在創建.o之前進行檢測,我需要從template.sth生成gen.h

有什么辦法可以自動執行嗎? 如果可以通過某種方式告訴g++如果缺少某些.h文件,可以將其添加到依賴項中,則可以解決問題1.。 解決問題1.后,多次執行make(我認為兩次就足夠了)最終導致構建項目(第一個make會生成依賴項文件,然后第二個make看到main.cpp取決於gen.hgen.h丟失了,有說明如何創建gen.h說明,因此它將在構建main.o之前創建gen.h

如果無法以某種方式自動完成,該如何解決? 我是否可以編寫Makefile指令來先生成所有生成的文件,還是需要手動將生成的文件作為依賴項添加到所有.o指令中?

更新:

進行少量更改后,帶有-MG標志的g++即使對於gen.h也會生成正確的文件。 我現在可以使用兩個make命令來構建我的項目。 第一個將創建正確的.d文件並中斷,因為缺少gen.h 第二個將有.d文件准備好了,所以它會產生gen.h建設之前main.o ,因此建設main.o一定會成功。

有沒有一種方法可以生成.d文件,然后在生成.o之前使用它?

您需要為生成的文件添加依賴項:

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

如果生成的文件很多,則可能需要一種自動創建這些依賴項的方法,具體取決於生成它們的方式。

此外,您希望獨立於.o文件生成.d文件,並在生成它們時使用-MG標志來忽略丟失的文件:

%.d: %.cpp
        g++ -MM -MF $@ -MP -MG $<

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

這樣,第一次運行make時,它將生成具有依賴項的.d文件,然后重新讀取它們並重新計算所有依賴項,然后再嘗試構建其他任何內容。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM