2011-09-13 32 views
0

這是一個簡單的makefile。關於makefile的問題

我有2個問題。

  1. all:$(SOURCES)$(EXECUTABLE) 爲什麼把SOURCE放在依賴項中。
  2. 「.cpp.o:」 爲什麼不寫 「的.o:的.cpp」

    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

如果SOURCE不作爲依賴項包含在內 - 那麼在修改源文件之後運行「make all」將導致可執行文件不被重新編譯。 – dave

+1

.cpp.o:是一種舊式後綴規則,指示具有.cpp文件擴展名的文件可以通過運行後續命令轉換爲文件的.o版本。 http://www.gnu.org/software/make/manual/make.html#Suffix-Rules – dave

回答

1

all$(SOURCES)的依賴是沒有必要的,甚至有用。依賴關係信息應該是這樣的,即可執行文件依賴於目標文件,並且目標文件依賴於源文件。

記號:

.cpp.o: 

是這樣的make處理編譯規則的原始(第7版UNIX™)版本。 GNU使(和Sun使)用%符號來允許:

%.o: %.cpp 

基本上,這是一個設計決策在當時是有道理的,也許意義不大回想起來。這不是最令人震驚的問題(這將是命令行開始時的選項卡)。

+0

有關GNU make OLD-FASHIONED SUFFIX規則的更多深入信息除了那些人之外,標籤有什麼問題新的使有時忘記他們? – eriktous

+0

幾乎所有其他地方都對空白的內容不可知論。更重要的是,它實際上不提供很多有用的服務,AFAICT。如果你在命令行開始時允許任意的空格,那麼'makefile'的解析器並不難。所以,它爲用戶(特別是初學者用戶)創造了一個真正沒有必要的障礙。 –