【发布时间】:2018-01-28 04:29:59
【问题描述】:
我已经编写了一个 makefile 来编译不同目录中的所有源并构建一个目标。即使文件没有更改,当我运行 make 时,它也不会重新编译未修改的文件。但是,它总是构建目标。为什么每次运行 make 时都会单独构建目标?
CC = gcc
CFLAGS = $(INCLUDES)
TARGET = FinalBin
OUTDIR := obj
INCLUDES = -Isrc/in
S1 = src/s1
S2 = src/s2
S1_SRC = $(wildcard $(S1)/*.c)
S2_SRC = $(wildcard $(S2)/*.c)
SRCS := $(S1_SRC) \
$(S2_SRC)
OBJS := $(patsubst %.c,$(OUTDIR)/%.o,$(SRCS))
SRCDIRS := $(S1) $(S2)
all: $(TARGET)
$(TARGET): builddir $(OBJS)
@echo "Building..." $@
@$(CC) $(OBJS) $(CFLAGS) -o $@
@echo "Build Complete!"
$(OUTDIR)/%.o: %.c
@echo "Compiling.." $(notdir $<)
@$(CC) $(CFLAGS) -MMD -c $< -o $@
clean:
-@rm -rf $(OUTDIR) FinalBin
@echo "Clean complete!"
builddir :
@$(call create-dir)
define create-dir
for dir in $(SRCDIRS); \
do \
mkdir -p $(OUTDIR)/$$dir; \
done
endef
-include $(wildcard $(OBJS:.o=.d))
$(TARGET) 每次都是从目标文件构建的。请指导我哪里出错了。
更新:
CC = gcc
CFLAGS = $(INCLUDES)
TARGET = FinalBin
OUTDIR := obj
INCLUDES = -Isrc/in
S1 = src/s1
S2 = src/s2
S1_SRC = $(wildcard $(S1)/*.c)
S2_SRC = $(wildcard $(S2)/*.c)
SRCS := $(S1_SRC) \
$(S2_SRC)
OBJS := $(patsubst %.c,$(OUTDIR)/%.o,$(SRCS))
SRCDIRS := $(S1) $(S2)
OUTDIRS := $(addprefix $(OUTDIR)/,$(SRCDIRS))
all: $(TARGET)
$(TARGET): $(OBJS)
@echo "Building..." $@
@$(CC) $(OBJS) $(CFLAGS) -o $@
@echo "Build Complete!"
$(OUTDIR)/%.o: $(OUTDIRS) %.c
@echo "Compiling.." $(notdir $(filter %.c,$^))
@$(CC) $(CFLAGS) -MMD -c $(filter %.c,$^) -o $@
clean:
-@rm -rf $(OUTDIR) FinalBin
@echo "Clean complete!"
$(OUTDIRS):
mkdir -p $@
builddir :
@$(call create-dir)
define create-dir
for dir in $(SRCDIRS); \
do \
mkdir -p $(OUTDIR)/$$dir; \
done
endef
-include $(wildcard $(OBJS:.o=.d))
这每次都会构建所有文件。
最终解决方案:
CC = gcc
CFLAGS = $(INCLUDES)
TARGET = FinalBin
OUTDIR := obj
INCLUDES = -Isrc/in
S1 = src/s1
S2 = src/s2
S1_SRC = $(wildcard $(S1)/*.c)
S2_SRC = $(wildcard $(S2)/*.c)
SRCS := $(S1_SRC) \
$(S2_SRC)
OBJS := $(patsubst %.c,$(OUTDIR)/%.o,$(SRCS))
SRCDIRS := $(S1) $(S2)
OUTDIRS := $(addprefix $(OUTDIR)/,$(SRCDIRS))
all: $(TARGET)
$(TARGET): $(OUTDIRS) $(OBJS)
@echo "Building..." $@
@$(CC) $(OBJS) $(CFLAGS) -o $@
@echo "Build Complete!"
$(OUTDIR)/%.o: %.c
@echo "Compiling.." $(notdir $<)
@$(CC) $(CFLAGS) -MMD -c $< -o $@
clean:
-@rm -rf $(OUTDIR) FinalBin
@echo "Clean complete!"
$(OUTDIRS):
@mkdir -p $@
-include $(wildcard $(OBJS:.o=.d))
最终解决方案按预期工作!
【问题讨论】: