0

这是我的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)/$@

# 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

我正在使用 gnu make 在 Linux 3.0 上运行

它在 $(EXEC) 定义中吗?

4

1 回答 1

3

我的猜测是,即使没有任何更改,这也会重新编译所有源代码。

看看这两条规则:

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

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

假设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 $@

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