2014-05-13 92 views
1

我在下面的Makefile中遇到困難。它總是重新編譯,因爲它正在尋找「source /」中的對象而不是「objects /」。Makefile始終重新編譯

由於我沒有編寫Makefile,也不知道所有這些選項的意思,我不知道如何告訴它在正確的文件夾中查找對象。

TITLE =example_title 

SRC_DIR = source/ 
OBJ_DIR = objects/ 
OUTDIR = build/ 

SRC := $(wildcard **/*.cpp) 
OBJ := $(patsubst source/%.cpp,%.o,$(SRC)) 
FP_OBJ := $(patsubst %,objects/%,$(OBJ)) 
LIB = $(wildcard *.a) $(wildcard **/*.a) 

CC =g++ 
LD =g++ 
CC_FLAGS = -m32 -c -Wall -g -o 
EXECUTABLE = $(TITLE) 
LD_FLAGS = -m32 -L/usr/lib32 -o $(OUTDIR)$(EXECUTABLE) 

$(OUTDIR)$(EXECUTABLE) : $(OBJ) 
    $(LD) $(LD_FLAGS) $(FP_OBJ) $(LIB) 

$(OBJ) : $(SRC) 
    $(CC) $(CC_FLAGS)$(OBJ_DIR)[email protected] $(SRC_DIR)$*.cpp 

$(TITLE).tar.gz : **/*.h **/*.cpp Makefile **/*.txt 
    tar -czf [email protected] Makefile **/*.h **/*.cpp **/*.txt 

dist: $(TITLE).tar.gz 

all : $(OUTDIR)$(EXECUTABLE) 

clean : 
    rm -f $(OBJ_DIR)*.o 
    rm -f $(OUTDIR)$(EXECUTABLE) $(TITLE).tar.gz 
+0

將來如何糾正_your_ makefile對他人的幫助?這是一個問答資源,不是一個幫助臺... –

+0

我知道這可能是一個令人討厭的問題,但我提供了這個makefile爲大學的任務,我不知道一個更合適或更快的地方在哪裏得到一個正確的答案。然而,測試版還包含了一個解釋,所以也許這將在未來幫助其他人。在問之前,我也試圖自己修復它,但沒有創建這樣的Makefiles的知識,我沒有得到任何地方...... – Susan

回答

1

這應做到:

$(OUTDIR)$(EXECUTABLE) : $(FP_OBJ) 
    $(LD) $(LD_FLAGS) $^ $(LIB) 

$(FP_OBJ) : $(OBJ_DIR)%.o : $(SRC_DIR)%.cpp 
    $(CC) $(CC_FLAGS) [email protected] $< 

基本的問題在這裏:

$(OBJ) : $(SRC) 
    $(CC) $(CC_FLAGS)$(OBJ_DIR)[email protected] $(SRC_DIR)$*.cpp 

除了事實$(OBJ) : $(SRC)使每個對象取決於所有來源,此規則承諾foo.o並提供objects/foo.o。因此,每次通過時,Make都看到沒有foo.o,並正式嘗試重建它以及需要它的可執行文件。

這個makefile還有其他問題,比如馬虎的通配符和在目錄名中包含斜槓的令人討厭的做法,但是它們並不那麼嚴重。

+1

打我也是,我只是寫一個評論,解釋你的修復做了什麼。雖然靜態模式規則不需要在目標/ prereq模式後綴上工作(因爲幹線兩側不會相同)? –

+0

@EtanReisner:[facepalm]謝謝,我會編輯。 – Beta

+0

非常感謝! – Susan