2011-06-28 14 views
4

我的makefile文件如下:GNU作出不予刪除中間文件

# The names of targets that can be built. Used in the list of valid targets when no target is specified, and when building all targets. 
TARGETS := libAurora.a libAurora.so 

# The place to put the finished binaries. 
TARGET_DIRECTORY := ./Binaries 

# The compiler to use to compile the source code into object files. 
COMPILER := g++ 

# Used when compiling source files into object files. 
COMPILER_OPTIONS := -I. -Wall -Wextra -fPIC -g -O4 

# The archiver to use to consolidate the object files into one library. 
ARCHIVER := ar 

# Options to be passed to the archiver. 
ARCHIVER_OPTIONS := -r -c -s 

SOURCE_FILES := $(shell find Source -type f -name *.cpp) 
OBJECT_FILES := $(SOURCE_FILES:.cpp=.o) 

.PHONY: Default # The default target, which gives instructions, can be called regardless of whether or not files need to be updated. 
.INTERMEDIATE: $(OBJECT_FILES) # Specifying the object files as intermediates deletes them automatically after the build process. 

Default: 
    @echo "Please specify a target, or use \"All\" to build all targets. Valid targets:" 
    @echo "$(TARGETS)" 

All: $(TARGETS) 

lib%.a: $(OBJECT_FILES) 
    $(ARCHIVER) $(ARCHIVER_OPTIONS) $(TARGET_DIRECTORY)/[email protected] $(OBJECT_FILES) 

lib%.so: $(OBJECT_FILES) 
    $(ARCHIVER) $(ARCHIVER_OPTIONS) $(TARGET_DIRECTORY)/[email protected] $(OBJECT_FILES) 

%.o: 
    $(COMPILER) $(COMPILER_OPTIONS) -c -o [email protected] $*.cpp 

正如你所看到的,.o文件被指定爲通過.INTERMEDIATE目標中間體。但是,編譯完成後不會按預期方式刪除它們。相反,他們仍然在他們創建的地方,混亂了我的源代碼目錄。

奇怪的是,它在另一臺機器上完美工作。這導致我相信它是make的不同版本,但man make仍然將其顯示爲「GNU make實用程序」。

爲什麼make刪除中間文件?

編輯:make -v報告版本3.81。

編輯:手動刪除文件.o(即一張白紙)後,make All輸出如下:

g++ -I. -Wall -Wextra -fPIC -g -O4 -c -o Source/File/File.o Source/File/File.cpp 
g++ -I. -Wall -Wextra -fPIC -g -O4 -c -o Source/Timer/Timer.o Source/Timer/Timer.cpp 
ar -r -c -s ./Binaries/libAurora.a Source/File/File.o Source/Timer/Timer.o 
ar -r -c -s ./Binaries/libAurora.so Source/File/File.o Source/Timer/Timer.o 
+2

您是否真的想在每次進行更改時重新構建所有源?如果它只是困擾你的'.o'噪音,那就把它們建在別的地方吧。並使用'make -v'來獲取版本。 – Mat

+0

@Mat如果有更好的方式不涉及明確指定每個單獨的源文件,請告訴。 – Maxpm

+0

運行時輸出「make All」是什麼? – Dan

回答

3

因此,我將其複製到我的機器上,並設法重現您的問題和解決方案。

請注意,在您的.INTERMEDIATE目標中,使用$(OBJECT_FILES)作爲先決條件,但對於使.o文件使用模式規則的規則。這令人困惑make,它不認識到這兩者都指向相同的事情。有兩個解決方案,這一問題:

  1. 變化.INTERMEDIATE$(OBJECT_FILES)的先決條件%.o,所以它看起來像

    .INTERMEDIATE: %.o 
    
  2. 變化作出的.o文件

    $(OBJECT_FILES): $(SOURCE_FILES) 
        $(COMPILER) $(COMPILER_OPTIONS) -c $< -o [email protected] 
    
    規則

    或類似的東西。

我推薦第一種解決方案,因爲如果您有幾個源文件,它不太可能導致編譯時出現奇怪的問題。

有關中間目標的更多信息,請參閱here

4

確認,該文件不存在,你開始構建項目之前。商務部明確表示:

因此,中間文件,以前沒有make存在make後不存在。

如果這不是問題,你應該發佈make的一些調試輸出。

+0

從乾淨的石板建造後問題依然存在。我從'make All'發佈了輸出。 – Maxpm

+0

感謝@Maxpm,但是爲了*調試輸出*使用'make -d All',再次從乾淨的狀態輸出並輸出 –