2016-07-20 91 views
4

我有大約10個帶有頭文件(.h)的源文件(.c)。 只有兩個源文件(.c)被鏈接到可執行文件(ELF)幷包含主函數。大多數文件被編譯成對象(.o)和(重新)使用(靜態鏈接)與可執行文件。GNU make和對象列表

我試圖定義一個通用的規則建立的所有對象:

%.o : %.c 
    $(CC) $(CCFLAGS) -c -o [email protected] $< 

這編譯到對象源的偉大工程。每次添加新的源文件時,我都不必擔心更新make文件。

但我不知道創建可執行文件規則的最佳方式是什麼?

exec1 : object1.o object2.o object3.o 
    call the linker 
exec2 : object1.o object2.o object4.o object5.o 
    call the linker 

這會工作;但是,每當我添加一個新的頭文件(foo.h)時,我還需要記住更新此規則的對象列表(添加foo.o)。

有什麼辦法可以自動解決給定目標的需要的對象(也許基於包含的頭文件?)?

有沒有更好的方法來定義可執行文件的目標?

請注意我不能使用通配符,因爲不是所有的可執行文件都需要所有的對象。或者可能鏈接器刪除多餘的對象?

謝謝!

+0

您指定的可執行文件的方式很好,通常新的頭對象會修改包含它們的C源文件。 – dvhh

+0

通過生成代碼對象文件的顯式規則,也是默認的GNU Make規則和其他Make變體 – dvhh

+1

對於您的具體問題的簡短回答是否定的,沒有設備可以自動猜測它應該包含的對象可執行文件基於源文件中的頭文件。 – MadScientist

回答

0

可以使用wildcard功能來自動文件列表維護像

sources := $(patsubst %.c,%.o,$(wildcard *.c)) 

您還應該的頭文件列表,像

headers := $(wildcard *.h) 

,並將它們添加到編輯規則像

%.o : %.c $(headers) 

GNU Make手冊(https://www.gnu.org/software/make/manual/make.html)有更多信息包括可能的陷阱。

+2

OP不能使用通配符,因爲並非所有可執行文件都需要所有對象。並且爲每個對象文件的所有標題添加依賴不是一個好主意。改爲使用cpp選項'-MD'。 – blatinox

+0

@blatinox你並不完全正確。雖然並非所有對象都依賴於所有標題,但如果相關標題已更改,則必須重新構建所有對象。然後,只有相關的可執行文件會被重新鏈接。 '-MD'是一個選項,但它會使構建更加複雜。我的方法非常簡單,適用於小型項目。至少,我總是以這種方式工作 – GMichael

+1

不,當您修改標題時,只有包含該標題的對象必須重建。通過您的解決方案,您可以重建所有對象!這是無用的,即使它適用於小型項目。使用'-MD'和其他('-MMD','-MP',...)並不複雜:你只需要在你的Makefile中添加3行,'make'和'cpp'爲你完成這項工作。 – blatinox