有人可以幫我弄清楚下面的make文件嗎?這些Makefile結構是什麼意思?
BINS=file1 file2 file3
all: $(BINS)
clean:
rm -f $(BINS) *~
$*: [email protected]
gcc -g -o [email protected] $?
這裏是我的問題:
- 什麼是gcc的-g選項?
- 什麼是$ *和$ @
- 它是如何知道執行最後一個目標的?
謝謝!
有人可以幫我弄清楚下面的make文件嗎?這些Makefile結構是什麼意思?
BINS=file1 file2 file3
all: $(BINS)
clean:
rm -f $(BINS) *~
$*: [email protected]
gcc -g -o [email protected] $?
這裏是我的問題:
謝謝!
從gcc
和make
文檔:
「-g產生調試操作系統的本機格式的信息」。
a。 「$ *隱式規則匹配的詞幹(請參閱如何匹配模式)如果目標文件是dir/a.foo.b並且目標模式是。%。b,則詞幹是dir/foo。詞幹是用於構建相關文件的名稱在靜態模式規則中,詞幹是與目標模式中的'%'匹配的文件名的一部分。「
b。 「$ @規則目標的文件名如果目標是一個存檔成員,那麼'$ @'是存檔文件的名稱。在具有多個目標的模式規則中(請參閱模式規則簡介), '$ @'是導致規則命令運行的任何目標的名稱。「
c。 「$?所有比目標更新的先決條件的名稱,它們之間有空格。」 (不問,但值得添加。)
「'all'編譯整個程序,這應該是默認目標。」
這個例子的makefile有點有限,因爲它似乎只是構建C程序。 GNU make有幾個更廣泛的例子,對學習如何編寫makefile有用。
RTFM並不是真正有用的答案。 – 2009-01-29 20:36:51
教一個人去釣魚...... – nicerobot 2009-01-29 20:37:15
1.)什麼是gcc的-g選項?
生成調試信息
2)什麼是$ *和$ @
$*
是規則的莖。當你排除像
%.ext: %.otherext
ext2otherext --input $? --output [email protected] --logfile $*.log
,以及規則試圖使file.ext
從file.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] $?
Q1和Q2已經被廣泛地回答,所以短暫的僅適用於Q3的說明:
使總是執行第一個目標,除非您指定了另一個目標。這也被稱爲默認目標。通常默認目標被稱爲「全部」。
第一行按照您期望的方式完成 - 它會創建一個名稱列表並將其分配給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
選項只需啓用調試信息被編譯
你應該。給這個問題一個更好的名字。 – 2009-01-29 20:30:01
這是整個makefile? $ *作爲目標非常奇怪 – Quassnoi 2009-01-29 20:57:26