在 Makefile 依賴項中使用「[email protected]」將無法運作

在 Makefile 依賴項中使用「[email protected]」將無法運作

嘗試像下面這樣的 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

做你希望它做的事情。

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

相關內容