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 $@
$@
和$<
到底作什麼? html
$@
和$<
稱爲自動變量 。 變量$@
表明已建立文件的名稱(即目標),而$<
表明建立輸出文件所需的第一個先決條件。
例如: 數據庫
hello.o: hello.c hello.h gcc -c $< -o $@
在這裏, hello.o
是輸出文件。 這就是$@
擴展到的內容。 第一個依賴項是hello.c
。 這就是$<
擴展到的內容。 函數
-c
標誌生成.o
文件; 有關詳細說明,請參見man gcc
。 -o
指定要建立的輸出文件。 spa
有關更多詳細信息,您能夠閱讀有關Linux Makefiles的文章 。 調試
另外,您能夠查看GNU make
手冊 。 這將使製做文件和調試它們變得更加容易。 code
若是運行此命令,它將輸出makefile數據庫: htm
make -p
$@
是要生成的文件的名稱, $<
是第一個前提條件(一般是源文件)。 您能夠在GNU Make手冊中找到全部這些特殊變量的列表。 對象
例如,考慮如下聲明: get
all: library.cpp main.cpp
在這種狀況下: 編譯器
$@
對all
求值 $<
評估爲library.cpp
$^
評估爲library.cpp main.cpp
$@
和$<
是特殊宏。
哪裏:
$@
是目標的文件名。
$<
是第一個依賴項的名稱。
從使用GNU Make,第3版管理項目 (受GNU Free Documentation License許可 ):
匹配規則後,由
make
設置自動變量 。 它們提供對目標和先決條件列表中元素的訪問,所以您沒必要顯式指定任何文件名。 它們對於避免代碼重複很是有用,可是在定義更通用的模式規則時相當重要。有七個「核心」自動變量:
$@
:表明目標的文件名。
$%
:歸檔成員規範的文件名元素。
$<
:第一個必備條件的文件名。
$?
:比目標更新的全部先決條件的名稱,用空格分隔。
$^
:全部必備組件的文件名,以空格分隔。 此列表已刪除重複的文件名,由於對於大多數用途(例如編譯,複製等),不須要重複的文件名。
$+
:相似於$^
,這是用空格分隔的全部必備組件的名稱,除了$+
包含重複項。 該變量是爲特定狀況建立的,例如連接器的參數,其中重複的值具備含義。
$*
:目標文件名的主幹。 詞幹一般是沒有後綴的文件名。 不建議在模式規則以外使用它。此外,上述每一個變量都有兩個變體,以便與其餘品牌兼容。 一個變體僅返回值的目錄部分。 這是經過在符號
$(@D)
,$(<D)
等後面附加一個「 D」來表示的。另外一個變體僅返回值的文件部分。 這經過在符號$(@F)
,$(<F)
等後面附加一個「 F」來表示。請注意,這些變體名稱的長度超過一個字符,所以必須用括號括起來。 GNU make經過dir和notdir函數提供了更具可讀性的替代方法。
若是main.cpp
, hello.cpp
, factorial.cpp
任何一個更改,Makefile都會生成hello
可執行文件。 實現該規範的最小可能的Makefile多是:
hello: main.cpp hello.cpp factorial.cpp g++ -o hello main.cpp hello.cpp factorial.cpp
爲了改進上述內容,咱們僅編譯那些已編輯的C ++文件。 而後,咱們僅將結果對象文件連接在一塊兒。
OBJECTS=main.o hello.o factorial.o hello: $(OBJECTS) g++ -o hello $(OBJECTS) main.o: main.cpp g++ -c main.cpp hello.o: hello.cpp g++ -c hello.cpp factorial.o: factorial.cpp g++ -c factorial.cpp
爲了對此進行改進,咱們能夠用一個.cpp.o
規則替換全部目標文件規則:
OBJECTS=main.o hello.o factorial.o hello: $(OBJECTS) g++ -o hello $(OBJECTS) .cpp.o: g++ -c $< -o $@
在這裏, .cpp.o
規則定義如何創建anyfile.o
從anyfile.cpp
。
$<
匹配第一個依賴項,在這種狀況下爲anyfile.cpp
$@
匹配目標,在這種狀況下爲anyfile.o
。 Makefile中存在的其餘更改是: