2011-02-23 20 views
15

我在這個site上找到了這個makefile。他們沒有解釋這個例子,所以我想知道是否有人有新的事情發生。有人可以解釋這個make文件嗎?

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 [email protected] 

.cpp.o: 
    $(CC) $(CFLAGS) $< -o [email protected] 
+0

Chris指出的第一行是定義shorthands,其餘的是一個「依賴圖」。當你改變你的源文件時,'make'系統將開始執行規則底部以獲得最終結果,最終創建編譯的最新可執行文件'hello'。 – Recct 2011-02-24 00:07:04

回答

28
CC=g++ 
CFLAGS=-c -Wall 
LDFLAGS= 
SOURCES=main.cpp hello.cpp factorial.cpp 

組四個變量是常量字符串。用於生成文件的其餘部分,只要$(CC)出現(例如),將通過g++

OBJECTS=$(SOURCES:.cpp=.o) 

替換設置可變對象是相同的源,除了無論圖案.cpp出現在源的話,其取代.o

EXECUTABLE=hello 

套另一個字符串常量變種

all: $(SOURCES) $(EXECUTABLE) 

釷e makefile中的第一條實際規則,它告訴make要構建all它必須首先構建$(SOURCES)$(EXECUTABLE)中的所有內容,然後不做任何事情。由於這是第一次,它成爲默認的目標,所以運行makemake all

$(EXECUTABLE): $(OBJECTS) 
     $(CC) $(LDFLAGS) $(OBJECTS) -o [email protected] 

相當於另一條規則:創建$(EXECUTABLE)(其擴展爲hello)它必須首先建立在$(OBJECTS)(相當於main.o hello.o factorial.o)的一切,然後運行命令$(CC) $(LDFLAGS) $(OBJECTS) -o [email protected]

.cpp.o: 
     $(CC) $(CFLAGS) -o [email protected] $< 

圖案規則:爲了打造.o結尾的文件中,第一個重建/創建/找到的.cpp結束相應的文件,然後運行命令$(CC) $(CFLAGS) -o [email protected] $<

最後兩個規則包含特殊變量[email protected]$<這是唯一有效的規則行動,並擴大到目標和第一依賴性分別

所以,當你運行make,它讀取所有這一切,然後嘗試構建默認目標(全部)。 由於它不存在,它會嘗試構建文件main.cpp,hello.cpp,factorial.cpp和hello。由於前3個(可能)存在,它會爲它們查找規則/依賴關係,但沒有找到任何,因此決定沒有爲它們執行任何操作。如果他們不存在,make會給出一個錯誤,說「沒有規則做目標'main.cpp'」

在「hello」的情況下,它取決於main.o,hello.o和factorial.o ,所以它看着它們。對於main.o,模式規則說它取決於main.cpp,所以如果main.o不存在或者main.cpp更新,它將運行命令g++ -c -Wall -o main.o main.cpp。 hello.o和factorial.o也是如此。

一旦這些完成,如果hello不存在或比任何這些.o文件(可能剛剛更改,所以可能很新)舊,它將運行該命令重新鏈接它。最後,它將運行空白命令(無所事事)來「重建」所有內容。

+0

我不明白的唯一原因就是爲什麼在模式規則中需要再次調用'-o $ @'。你能解釋我嗎?謝謝 – Kyrol 2014-03-31 21:40:27

+0

@Kyrol:'-o'指定要寫入的文件的名稱。在某些編譯器上,默認輸出文件可能已經與目標文件相同,但重新指定不會造成影響。 – 2014-03-31 21:49:28

+0

是不是'.cpp.o:'後綴規則而不是模式規則? – jdknight 2015-01-15 16:05:45

相關問題