2009-04-30 89 views
1

支持你必須通過一些文件包含一個C程序,有的一個被一些人組成,所以如下:幫我創建一個Makefile

---------------------------------------- 
File   | Included files   
---------------------------------------- 
main.c   | stdio.h, table.h 
---------------------------------------- 
list.c   | list.h 
---------------------------------------- 
symbol.c  | symbol.h 
---------------------------------------- 
table.c   | table.h 
---------------------------------------- 
table.h   | symbol.h, list.h 
---------------------------------------- 

請幫我創建一個makefile,謝謝非常! 這是我的Makefile,但有問題嗎?誰可以調試這些問題,謝謝!

hello: main.o table.o 
    gcc main.o table.o -o hello 

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

table.o: table.c table.h 
    gcc -c table.c 

symbol.o: symbol.c symbol.h 
    gcc -c symbol.c 

list.o: list.c list.h 
    gcc -c list.c 


clean: 
    rm hello *.o 
+0

雖然pax給了你一個好的開始,他的例子仍然建立在假設(即'main'可執行文件從所有來源調用函數)上。可能是因爲依賴性比這個更復雜,所以他的例子可能是完全錯誤的。 – KevinDTimm 2009-04-30 03:45:27

+0

如果我們知道哪些是你正在使用的(即GNU,BSD等),可能會有一些簡化。 此外,list.o應該鏈接到某個地方? – ctuffli 2009-04-30 15:48:34

回答

6

這裏是一個開始,不完全是一個專業會怎麼做,但良好的初學者水平:

hello: main.o list.o symbol.o table.o 
    gcc -o hello main.o list.o symbol.o table.o 

main.o: main.c table.h symbol.h list.h 
    gcc -c -o main.o main.c 

list.o: list.c list.h 
    gcc -c -o list.o list.c 

symbol.o: symbol.c symbol.h 
    gcc -c -o symbol.o symbol.c 

table.o: table.c table.h symbol.h list.h 
    gcc -c -o table.o table.c 

clean: 
    rm hello *.o 

與給定生成文件的具體問題是,你沒有連接在所有目標文件。由於main.c包括table.htable.h包括symbol.hlist.h,因此您的程序幾乎肯定需要鏈接symbol.olist.o以及。

這也是很好的做法,遵循頭部依賴(例如,main.o取決於table.hsymbol.h/list.h因爲table.h取決於這兩個) - 這是因爲沒有「純」的方式來獲得頭依賴的中間文件。

而且很少將標準頭文件放入make文件中,僅僅是因爲它們預計不會改變 - 如果它們(新編譯器),只需清理並重新制作。