2013-03-31 67 views
0

這是我的makefile ...爲什麼它重新編譯所有的源,即使只有一個變化?爲什麼如果我只更改一個文件,makefile會重新編譯整個文件集?

CC = g++ 
CFLAGS = -w -g -c 
LIBS = -lm 

EXEC = DFMS_PDS_L2_to_L3 

.PHONY : clean tgz wdtgz 

HOMEDIR = ../ 
BIN = bin 
SRC = src 
OBJ = obj 

SRCFILES := $(wildcard $(SRC)/*.cc) 
OBJFILES := $(patsubst %.cc, $(OBJ)/%.o, $(notdir $(SRCFILES))) 
OBJS := $(patsubst %.cc, %.o, $(notdir $(SRCFILES))) 

# Executable Targets 
all: $(EXEC) 

$(EXEC) : $(OBJS) 
$(CC) $(LIBS) $(OBJFILES) -o $(BIN)/$(EXEC) 

# Dependencies 
%.o: $(SRC)/%.cc 
$(CC) $< $(CFLAGS) -o $(OBJ)/[email protected] 

# Miscellaneous Targets 
clean: 
rm -rf $(BIN)/$(EXEC) obj/*.o *~ 

tgz: 
tar cvzf $(HOMEDIR)cppbuild.tgz $(HOMEDIR)cppbuild --exclude=data 
cp $(HOMEDIR)cppbuild.tgz $(HOMEDIR)cppbuild.tgz.allow 

wdtgz: 
tar cvzf $(HOMEDIR)cppbuild.tgz $(HOMEDIR)cppbuild 
cp $(HOMEDIR)cppbuild.tgz $(HOMEDIR)cppbuild.tgz.allow 

我在Linux 3.0上運行使用GNU使

是在$(EXEC)定義是什麼?

回答

3

我的猜測是,即使沒有更改,此重新編譯所有的來源。

看看這兩個規則:

$(EXEC) : $(OBJS) 
$(CC) $(LIBS) $(OBJFILES) -o $(BIN)/$(EXEC) 

%.o: $(SRC)/%.cc 
$(CC) $< $(CFLAGS) -o $(OBJ)/[email protected] 

假設foo.cc是唯一的源文件。第一條規則說目標取決於foo.o,但實際上是從obj/foo.o建立的。第二個可以調用構建foo.o(這是第一個規則要求的),但它實際上構建了obj/foo.o。所以你第一次運行Make會正確的生成可執行文件(和obj/foo.o)。但每次之後,Make都會看到foo.o不存在,並嘗試構建它並重建可執行文件。

解決的辦法是讓他們建立重寫規則 - 以及依靠 - 他們要求什麼:

all: $(BIN)/$(EXEC) 

$(BIN)/$(EXEC) : $(OBJFILES) 
$(CC) $(LIBS) $^ -o [email protected] 

$(OBJ)/%.o: $(SRC)/%.cc 
$(CC) $< $(CFLAGS) -o [email protected] 
+0

謝謝!那就是訣竅 – MikRin

相關問題