2014-03-25 79 views
1

我在Makefile業務中迷失了方向,我試圖與它接觸。如果有人能夠在我正在編程的例子中清楚說明,我很樂意。使用Makefile鏈接多個文件

我有這些文件:

my-bit-vector.h -> a header file included in eratost.c, ppm.c 
ppm.c -> a .c file which includes my-bit-vector.h and error.h 
error.h -> a header file included in eratost.c, ppm.c 
error.c -> a .c file which includes error.h and defines the functions in it 
erato.c -> a .c file which includes my-bit-vector.h and error.h 

我需要將這些連接成一個可執行文件。我將如何通過Makefile來做到這一點?我希望我沒有忘記一些事情。能否請你幫忙?

+0

哪一個包含你的'main'函數?所有這些文件都放在一個目錄中嗎? – patrickvacek

+0

@patrickvacek爲什麼包含main()的源代碼很重要? – mah

+0

main()以ppm.c爲單位,文件在一起。 – imre

回答

3

簡單地說,Makefile的內容是一個或多個目標(你想要構建的東西)。每個目標都有依賴關係(如果任何依賴關係還不存在,必須構建它們,如果它們確實存在但它們比目標更新,則目標必須重建),規則(構建目標的命令,大概來自依賴)。

就你而言,可以說你的最終輸出是一個名爲program的程序。您已經確定了構建它的源代碼,但是您不直接從源創建可執行文件,而是從目標文件中執行。你可以開始你的Makefile這樣的:

program: ppm.o error.o erato.o 
     cc -o program ppm.o error.o erato.o 

警告的間距在基準線(如上圖所示的cc命令行)需要一個TAB,而不僅僅是空間!

這足以開始,但還不夠正確。你會注意到沒有目標:.o's的依賴/規則,但它仍然有效,因爲Make有一些內置的規則。

有了這個makefile,如果你輸入「make」兩次,第一次你會看到所有東西都被構建,第二次不會被修改 - 所以沒有任何改變,所以不需要重建。不幸的是,如果你現在編輯的.h的,以.c結尾的仍然不會重建,所以讓我們解決這個問題:

program: ppm.o error.o erato.o 
     cc -o program ppm.o error.o erato.o 

ppm.o: ppm.c my-bit-vector.h error.h 

error.o: error.c error.h 

erato.o: erato.c my-bit-vector.h error.h 

現在,你有你的依賴關係設置爲使得make重建必須在頭重建來源更改。這些源代碼沒有規則,因爲這裏的內置規則(通常)是足夠的。當然,如果有必要,您可以覆蓋內置。

在這裏,當您鍵入「make」時,工具將會找到第一個目標(程序)並檢查其依賴關係。然後,只要存在需要考慮構建的目標,就會遞歸地確保其每個依賴項都是最新的(基於它們的目標:依賴性/規則定義)。最後它將應用這個目標的規則來完成它的構建。

還有很多更多可以使用makefile來完成,這只是一個簡短的介紹。

+0

感謝您的幫助 – imre

3
program: ppm.o error.o erato.o 
    gcc ppm.o error.o erato.o -o program 
ppm.o: ppm.c 
    gcc -c ppm.c -o ppm.o 
error.o: error.c 
    gcc -c error.c -o error.o 
erato.o: erato.c 
    gcc -c erato.c -o erato.o 

「:」之前的東西是目標。 「:」之後的東西是此目標所需的目標。 所以如果你「製作程序」make正在尋找一個名爲「全部」的目標。目標都需要ppm.o,它也被定義爲makefile中的目標。所以它首先執行這個目標。目標ppm.o需要ppm.c,它沒有在makefile中定義的目標,所以它可能是一個文件。我希望這解釋了你的基本功能。

http://mrbook.org/tutorials/make/ 是一個非常好的初學者教程,有一些基本的makefile示例。

+0

在這樣一個簡單的makefile中,最好重命名你的初始目標'program'而不是'all'。這樣,如果make發現'program'已經存在並且不比其任何直接或間接的依賴性更舊,make知道它不必重新編譯程序。一個合理的中間立場是也將'all:program'添加爲目標/依賴項,以允許額外的頂級構建,而不用重建任何不需要重建的東西。 – mah

+0

改變了它。感謝提示。 –