Gnu-Make

在 Makefile 依賴項中使用 $@.o 將不起作用

  • June 2, 2021

嘗試如下的 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

做你希望它做的事情。

(根據我的經驗,解決問題的方法通常比訴諸二次擴展更好,但這只能通過了解您嘗試做的總體目標來確定。)

引用自:https://unix.stackexchange.com/questions/652314