嘗試像下面這樣的 Makefile 規則不起作用(GNU Make 4.0):
foo: [email protected] other.o
bar: bar.o other.o
該檔案foo.c
已編譯(為foo.o
),但連結命令為cc -o .o
.
相反,bar
已正確編譯並鏈接為cc bar.o other.o -o bar
.
誰能解釋一下差異(或問題)?
答案1
這在以下部分中得到解決:自動變數在 GNU Make 手冊中:
認識到自動變數值可用的有限範圍非常重要:它們僅在配方中具有值。特別是,您不能在規則的目標清單中的任何位置使用它們;它們在那裡沒有任何價值,並將擴展為空字串。此外,無法在規則的先決條件清單中直接存取它們。一個常見的錯誤是嘗試
$@
在先決條件清單中使用;這是行不通的。
本段的其餘部分給出了一個可能的解決方案,儘管是 GNU Make 特定的解決方案:二次擴張。將你的 Makefile 寫成
.SECONDEXPANSION:
foo: [email protected] other.o
bar: bar.o other.o
允許$$@
給定適當的值,然後
$ make foo
cc -c -o foo.o foo.c
cc -c -o other.o other.c
cc foo.o other.o -o foo
做你希望它做的事情。
(根據我的經驗,通常有比訴諸二次擴展更好的方法來解決問題,但這只能透過了解您正在嘗試做的事情的總體目標來確定。)