[英]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
):
gen.h
,指令生成的.d
文件不起作用: fatal error: gen.h: No such file or directory
include "gen.h"
.d
文件。 它起作用了,因為添加新的依賴項需要更改當前的依賴項之一。 因此,添加一個.o
后將進行重建並生成新的.d
。 現在,我需要在創建.o
之前進行檢測,我需要從template.sth
生成gen.h
有什么辦法可以自動執行嗎? 如果可以通過某種方式告訴g++
如果缺少某些.h
文件,可以將其添加到依賴項中,則可以解決問題1.。 解決問題1.后,多次執行make(我認為兩次就足夠了)最終導致構建項目(第一個make
會生成依賴項文件,然后第二個make
看到main.cpp
取決於gen.h
, gen.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.