0

ここに私のmakefileがあります... 1つだけ変更してもすべてのソースを再コンパイルするのはなぜですか??

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)/$@

# 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 make を実行しています

それは $(EXEC) 定義にありますか?

4

1 に答える 1

3

私の推測では、何も変更されていなくても、これによりすべてのソースが再コンパイルされます。

次の 2 つのルールを見てください。

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

%.o: $(SRC)/%.cc
$(CC) $< $(CFLAGS) -o $(OBJ)/$@

が唯一foo.ccのソース ファイルであるとします。最初のルールは、ターゲットが に依存することを示していますfoo.oが、実際には からビルドされobj/foo.oます。2 番目はビルドするために呼び出すことができますfoo.o(最初のルールで要求されます) が、実際には をビルドしobj/foo.oます。したがって、初めて Make it を実行すると、実行可能ファイルが正しくビルドされます (およびobj/foo.o)。しかし、その後毎回、Make はそれfoo.oが存在しないことを認識し、それをビルドして実行可能ファイルを再ビルドしようとします。

解決策は、ルールが主張するものを構築し、依存するようにルールを書き直すことです。

all: $(BIN)/$(EXEC)

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

$(OBJ)/%.o: $(SRC)/%.cc
$(CC) $< $(CFLAGS) -o $@
于 2013-03-31T23:08:17.907 に答える