2013-09-28 34 views
1

我的makefile不會檢查是否有任何更新,只是編譯,如果它有多個單一的源文件中添加。它工作正常,只有一個源文件。Makefile不檢查是否更新,只是編譯

它似乎是任何未列出的源文件,因爲第一個文件將始終被重新編譯和鏈接。

SOURCES=myclass.cpp mylock.cpp 
EXECUTABLE=locktest 
LIBRARIES=-pthread 
CFLAGS=-Wall 
CXX=g++ 
DIR=host/ 
EXE=$(EXECUTABLE) 

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

$(EXE): $(OBJECTS) 
    $(CXX) -o [email protected] $(OBJECTS) $(LIBRARIES) 

$(DIR)%.o: %.cpp $(DIR) 
    $(CXX) $(CFLAGS) -c $< -o [email protected] 

$(DIR): 
    @mkdir $(DIR) 

clean: 
    @rm $(OBJECTS) $(EXE) 
    @rmdir $(DIR) 

輸出顯示問題:

[email protected]:~/Desktop/Locktest$ make 
g++ -Wall -c myclass.cpp -o host/myclass.o 
g++ -Wall -c mylock.cpp -o host/mylock.o 
g++ -o locktest host/myclass.o host/mylock.o -pthread 
[email protected]:~/Desktop/Locktest$ make 
g++ -Wall -c myclass.cpp -o host/myclass.o 
g++ -o locktest host/myclass.o host/mylock.o -pthread 

回答

1

由於@lijat指出,當你建立$(DIR)對象,操作系統更新目錄的修改時間,所以,在這樣的規則:

$(DIR)%.o: %.cpp $(DIR) 
    ... 

的前提$(DIR)將始終顯示爲除了最後製作的目標外,它比任何目標都要新。

如果製作的版本足夠新,你可以過去,這通過使$(DIR)order-only prerequisite

$(DIR)%.o: %.cpp | $(DIR) 
    ... 
+0

你是正確的!這只是目錄。 – MRJ

1

是否在文件系統更新時,編譯寫的.o文件將有

$(DIR)%的DIR目錄中的修改時間爲O: %.cpp $(DIR)

確保所有.o文件將被重新編譯,如果有任何更新該目錄的修改時間。