2011-03-22 141 views
2

我想補充make文件頭文件的依賴性Make文件頭文件的依賴性

我寫的規則

${OBJECTDIR}/%.o: %.cc %.h 
gcc $(WarningLevel) $(CFLAGS) $(INCLUDES) -c -o [email protected] $^ 

但有兩個錯誤

一爲.cc文件這不有任何.h文件。它不會制定任何規則。 第二個是目標文件構建由規則在鏈接

file format not recognized; treating as linker script 

我怎麼能做到這一點給錯誤? (源文件應該編譯如果頭文件被修改後得到)

+0

一般情況下,你把翻譯單位成目標文件,因爲頭文件和不是獨立的翻譯單位,這似乎有點奇怪,你列出%.H爲開始的依賴。 – 2011-03-22 16:10:52

+0

我認爲這裏沒有簡單的解決方案。即使'$(通配符%.h)'也不行,因爲函數在**匹配之前展開**(我被這幾次咬了)。你可以1)使用基於'$(shell find ...)','define','$(foreach)'和'$(eval)'的東西,但這很棘手,2)使用gcc的'-M'選項家人爲你生成依賴關係。我通常會參加第二場比賽,但我在工作,現在我沒有一個例子可以幫助你。 – 2011-03-22 16:12:03

+0

make文件是製表符敏感的。 gcc行應該是'\ tgcc ',即gcc前面的製表符。 – 2011-03-22 17:04:00

回答

2

首先,你沒有向我們展示你的鏈接命令。其次,你不應該在這裏使用$^$^展開爲所有依賴項的列表(這裏是.c.h),但我們只想編譯.c文件。使用$<,擴展只對第一個依賴關係的名字:

${OBJECTDIR}/%.o: %.c %.h 
     gcc $(WarningLevel) $(CFLAGS) $(INCLUDES) -c -o [email protected] $< 
1

您需要提供您列出的頭文件相關的規則:

%.h: 
    echo This is my build target for header files. 

製作實際上不會與%.H做任何事文件,但至少要告訴它注意文件更改(然後導致.o文件需要重新編譯)。

+0

如果沒有文件產生,這將不起作用。要麼添加'touch $ ^'作爲配方(這將創建一個空文件),或者嘗試使用'.PHONY:%。h',這也不應該是好的。 – 2011-03-22 16:17:13

+0

@亞歷山大:好點。 – 2011-03-22 16:20:02

+0

這是沒有.h文件的.cc文件的正確答案(儘管它有點破解)。鏈接錯誤來自OP沒有顯示的鏈接命令,所以我們無法說出那有什麼問題。 – 2011-03-22 16:31:02