makefile符號$ @和$ <是什麼意思?



Answers

$@$<被稱為自動變量。 $@是輸出變量。 $<是第一個輸入變量。 例如:

hello.o: hello.c hello.h
         gcc -c $< -o $@

這裡, hello.o是輸出文件。 這是$@擴展到的。 第一個依賴是hello.c 。 這就是$<擴展到的。

-c標誌生成.o文件; 請參閱man gcc獲取更詳細的解釋。 -o指定要輸出到的文件。

有關更多詳細信息,請閱讀this

另外,你可以檢查GNU手冊。 有一種方法可以調試makefile以更好地理解它。

這將輸出makefile數據庫:

$make -p 
Question
CC=g++
CFLAGS=-c -Wall
LDFLAGS=
SOURCES=main.cpp hello.cpp factorial.cpp
OBJECTS=$(SOURCES:.cpp=.o)
EXECUTABLE=hello

all: $(SOURCES) $(EXECUTABLE)

$(EXECUTABLE): $(OBJECTS)
    $(CC) $(LDFLAGS) $(OBJECTS) -o $@

.cpp.o:
    $(CC) $(CFLAGS) $< -o $@

$@$<做什麼?




使用GNU Make管理項目,第3版 (它在GNU自由文檔許可下 ):

自動變量在規則匹配後由make設置。 它們提供對來自目標和先決條件列表的元素的訪問,因此您不必顯式指定任何文件名。 它們對避免代碼重複非常有用,但在定義更一般的模式規則時非常重要。

有七個“核心”自動變量:

  • $@ :代表目標的文件名。

  • $% :檔案成員規範的文件名元素。

  • $< :第一個先決條件的文件名。

  • $? :比目標更新的所有先決條件的名稱,以空格分隔。

  • $^ :所有先決條件的文件名,以空格分隔。 此列表具有重複的文件名,因為對於大多數用途,例如編譯,複製等,不需要重複。

  • $+ :與$^類似,這是用空格分隔的所有先決條件的名稱,不同之處在於$+包含重複項。 此變量是為特定情況創建的,例如重複值具有含義的鏈接器參數。

  • $* :目標文件名的詞幹。 一個詞幹通常是一個沒有後綴的文件名。 不鼓勵在模式規則之外使用它。

另外,為了與其他品牌兼容,上述每個變量都有兩個變體。 一個變體只返回值的目錄部分。 這通過向符號$(@D)$(<D)等附加一個“D”來表示。另一個變量只返回值的文件部分。 這通過向符號$(@F)$(<F)等附加一個“F”來表示。請注意,這些變體名稱長度超過一個字符,因此必須用括號括起來。 GNU make為dir和notdir函數提供了一個更可讀的替代方案。




Links