2016-11-01 120 views
0

當我的程序包含一個包含另一個標題的標題時會發生什麼? 例如,說main.c包含header1.h,而header1.h包含header2.h。如果我的生成文件是:Makefile說明:包含包含另一個標題的標題的文件

main.x: main.o 
    gcc -o main.x 

main.o: main.c header1.h header2.h 
    gcc -c main.c 

OR是不是必須包含header2.h?

main.x: main.o 
    gcc -o main.x 

main.o: main.c header1.h 
    gcc -c main.c 

還是不需要包含任何頭文件?

main.x: main.o 
    gcc -o main.x 

main.o: main.c 
    gcc -c main.c 
+0

是的。所有包含的標題,包括那些包含在內的標題。注意,gcc將使用'-M'(和類似的相關的類似'-MM')選項來確定你的依賴關係。 – Gene

+0

@RuslanOsmanov嗯,是的,但在這個問題中,你會看到一秒鐘後是怎麼回事,另一個你必須分析一個有點複雜的例子。 –

回答

0

在Makefile中列出依賴的一點是讓make知道下它需要重建什麼情況。如果構建目標後列出的依賴項文件已被修改,則目標需要重建。因此,列出在構建目標時粗略查閱的所有文件是一個好主意。

如果您沒有列出包含小時的文件,那麼所有內容都將繼續工作 - 直到您編輯文件時,您並未告知make,此時您會發現make可能不會重新編譯。

0

您必須將每個包含文件命名爲依賴項,因爲(按設計)make並不知道C如何工作。 gcc和GNU做提供了一個解決方案:

main.x: main.o 
    gcc -o main.x 

main.o main.d: main.c 
    gcc -MD -MF -MG -MP main.d -c main.c 

-include main.d 

include原因前面的儀表板使忽略丟失.d文件,-MD ...導致gcc來產生包含在make使用依賴規則的文件(-MD導致生成作爲編譯的副作用,-MF命名文件將它們寫入,-MG導致創建一個假定的規則,將創建丟失的頭文件併爲頭文件創建假目標,因此刪除頭文件不會由於缺少依賴關係,阻止進一步建設)。