【发布时间】:2015-07-20 17:43:03
【问题描述】:
Example 的目录结构是这样的。
示例 - 包含 Makefile、main.c、xyz.c、xyz.h 和子目录 Hal 和 Interrupt_Config Hal - 包含 test2.c 和 test2.h Interrupt_Config - 包含 try.h
EXE := Micro
CC := gcc
CPPFLAGS := -IHal -IInterruptConfig
VPATH := Hal:InterruptConfig
OUT_DIR := Output/
OUT_SRC := Output/source/
OUT_EXE := Output/output
LIBS = Hal InterruptConfig
MAIN_OBS := $(patsubst %.c,%.o,$(wildcard *.c))
INT_OBS := $(patsubst %.c,%.o,$(wildcard InterruptConfig/*.c))
HAL_OBS := $(patsubst %.c,%.o,$(wildcard Hal/*.c))
ALL_DEPS := $(patsubst %.o,%.d,$(MAIN_OBS) $(HAL_OBS) $(INT_OBS))
ALL_OBS := $(MAIN_OBS) $(INT_OBS) $(HAL_OBS)
all: $(OUT_DIR) $(EXE)
$(OUT_DIR):
mkdir -p $(OUT_DIR)
mkdir -p $(OUT_SRC)
mkdir -p $(OUT_EXE)
%.o: %.c
$(CC) -o $(OUT_SRC)$@ -MD -MP $(CPPFLAGS) $(CFLAGS) -c $<
$(EXE): $(MAIN_OBS) $(HAL_OBS) $(INT_OBS)
$(CC) -o $(OUT_EXE)$@ $(LDFLAGS) $(OUT_SRC)*.o $(LDLIBS)
$(HAL_OBS): %.o: %.c
$(CC) -o $(OUT_SRC)$(notdir $@) -MD -MP $(CPPFLAGS) $(CFLAGS) -c $<
$(INT_OBS): %.o: %.c
$(CC) -o $(OUT_SRC)$(notdir $@) -MD -MP $(CPPFLAGS) $(CFLAGS) -c $<
-include $(ALL_DEPS)
clean:
rm -rf $(OUT_DIR) $(ALL_DEPS)
.PHONY: all clean
每当我进行 make 时,它都会成功创建一个名为 Output 的目录,其子目录 source 包含所有目标文件,output 包含一个名为 Micro 的可执行文件。如果我第一次让它成功构建了所有东西,但如果我再次 make,我希望它应该给 make - 无事可做,但它会构建所有东西 除了 $(OUT_DIR) 规则。我无法弄清楚是什么问题。
重复制作 - 预期 - 没有
实际 -
gcc -o Output/source/main.o -MD -MP -IHal -IInterrupt_Config -c main.c
gcc -o Output/source/xyz.o -MD -MP -IHal -IInterrupt_Config -c xyz.c
gcc -o Output/source/test2.o -MD -MP -IHal -IInterrupt_Config -c Hal/test2.c
gcc -o Output/output/nextgenrsm Output/source/*.o
我也不确定我是否正确地做依赖关系。
【问题讨论】:
-
我遇到了类似的问题,我将 OUT_DIR 列为依赖项,以确保它在尝试将源代码编译到其中之前已生成。不幸的是,每次更改文件时目录都会更改,这导致我的构建也每次生成都重建所有内容。不过,我没有看到您将 OUT_DIR 列为对您的文件的依赖项。
-
您违反了Rules of Makefiles 的规则 2。您的规则会生成与目标名称不匹配的文件。因此,无法知道您的目标是最新的,因为它可以告诉您的目标文件不存在。
-
你看过你的 .d 文件了吗?
-
你的规则应该是这样的:$(OUT_EXE/SRC)/%.o: %.c