Gnu-Make在 Makefile 依賴項中使用
在 Makefile 依賴項中使用 $@.o
將不起作用
嘗試如下的 Makefile 規則不起作用(GNU Make 4.0):
foo: $@.o other.o bar: bar.o other.o
該文件
foo.c
已編譯(到foo.o
),但連結命令是cc -o .o
.相反,
bar
被正確編譯和連結為cc bar.o other.o -o bar
.誰能解釋差異(或問題)?
這在 GNU Make 手冊中的自動變數部分中得到了解決:
認識到自動變數值可用的有限範圍非常重要:它們僅在配方中具有值。特別是,您不能在規則的目標列表中的任何地方使用它們;它們在那裡沒有任何價值,並將擴展為空字元串。此外,它們不能在規則的先決條件列表中直接訪問。一個常見的錯誤是嘗試
$@
在先決條件列表中使用;這行不通。本段的其餘部分提供了一種可能的解決方案,儘管是 GNU Make 特定的解決方案:二級擴展。將您的 Makefile 編寫為
.SECONDEXPANSION: foo: $$@.o 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
做你希望它做的事情。
(根據我的經驗,解決問題的方法通常比訴諸二次擴展更好,但這只能通過了解您嘗試做的總體目標來確定。)