2009-01-29 96 views
4

有人可以幫我弄清楚下面的make文件嗎?這些Makefile結構是什麼意思?

BINS=file1 file2 file3 

all: $(BINS) 

clean: 
     rm -f $(BINS) *~ 

$*: [email protected] 
     gcc -g -o [email protected] $? 

這裏是我的問題:

  1. 什麼是gcc的-g選項?
  2. 什麼是$ *和$ @
  3. 它是如何知道執行最後一個目標的?

謝謝!

+0

你應該。給這個問題一個更好的名字。 – 2009-01-29 20:30:01

+0

這是整個makefile? $ *作爲目標非常奇怪 – Quassnoi 2009-01-29 20:57:26

回答

5

gccmake文檔:

  1. 「-g產生調試操作系統的本機格式的信息」。

  2. a。 「$ *隱式規則匹配的詞幹(請參閱如何匹配模式)如果目標文件是dir/a.foo.b並且目標模式是。%。b,則詞幹是dir/foo。詞幹是用於構建相關文件的名稱在靜態模式規則中,詞幹是與目標模式中的'%'匹配的文件名的一部分。「

    b。 「$ @規則目標的文件名如果目標是一個存檔成員,那麼'$ @'是存檔文件的名稱。在具有多個目標的模式規則中(請參閱模式規則簡介), '$ @'是導致規則命令運行的任何目標的名稱。「

    c。 「$?所有比目標更新的先決條件的名稱,它們之間有空格。」 (不問,但值得添加。)

  3. 「'all'編譯整個程序,這應該是默認目標。」

這個例子的makefile有點有限,因爲它似乎只是構建C程序。 GNU make有幾個更廣泛的例子,對學習如何編寫makefile有用。

2

1.)什麼是gcc的-g選項?

生成調試信息

2)什麼是$ *和$ @

$*是規則的莖。當你排除像

%.ext: %.otherext 
    ext2otherext --input $? --output [email protected] --logfile $*.log 

,以及規則試圖使file.extfile.otherext,然後登錄進入file.log

[email protected]是目標文件名(file.ext在上述情況下)。

3.)如何知道執行最後一個目標?

這是一個謎。

$*用於中間文件:喜歡,當你試圖使%.so%.c,你需要一箇中介%.o既不是目標,也不是一個來源。你把:

%.so: %.c 
    gcc -fPIC -g -c -o $*.o $? 
    ld -shared -o [email protected] $*.o 

換句話說,在%.extension規則,$*是一切,但.extension

作爲目標,$*是沒有意義的。

您確定此規則實際上在某處執行嗎?當我嘗試使用你的Makefile重現它,它會應用默認的規則(cc -o),而不是gcc -g -o

規則,你需要似乎是:

%: %.c 
    gcc -g -o [email protected] $? 
0

Q1和Q2已經被廣泛地回答,所以短暫的僅適用於Q3的說明:

使總是執行第一個目標,除非您指定了另一個目標。這也被稱爲默認目標。通常默認目標被稱爲「全部」。

1

第一行按照您期望的方式完成 - 它會創建一個名稱列表並將其分配給BIN。接下來,定義一個名爲all的制定目標,該制定目標取決於$BIN中列出的目標(all在構建$BIN中的每個目標之前都不能構建)。 all是一個特殊的構建目標;如果您只運行make而不是比如說make clean,則all目標會自動生成。沒有與all關聯的實際命令 - 它只是確保所有依賴關係都已建立。最後一個相當簡單的命令定義了一個名爲clean的構建目標,它刪除$BIN中列出的每個文件(注意,$BIN既用作構建目標列表,又用作此生成文件中的文件列表)以及所有備份。

接下來,我們得到一個基本上是魔法的線。 $*是一個特殊的構建目標,意思是「沒有特別定義的東西」。當make嘗試構建all時,它會找到目標並開始處理其依賴關係。但是當它試圖構建file1時,沒有明確的目標定義。相反,它使用$*來構建file1。同樣,[email protected]被替換爲構建目標的名稱,$?及其依賴關係(排序;你最好檢查手冊)。當make去建立file1,屆時,$*規則使之產生如同以下規則進行定義:

file1: file1.c 
     gcc -g -o file1 file1.c 

最後,-g選項只需啓用調試信息被編譯