Example的目錄結構就像這樣。Makefile總是重新編譯一些章節
實施例 - 包含生成文件,main.c中,xyz.c,xyz.h和子目錄Hal和Interrupt_Config 哈爾 - 包含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)[email protected] -MD -MP $(CPPFLAGS) $(CFLAGS) -c $<
$(EXE): $(MAIN_OBS) $(HAL_OBS) $(INT_OBS)
$(CC) -o $(OUT_EXE)[email protected] $(LDFLAGS) $(OUT_SRC)*.o $(LDLIBS)
$(HAL_OBS): %.o: %.c
$(CC) -o $(OUT_SRC)$(notdir [email protected]) -MD -MP $(CPPFLAGS) $(CFLAGS) -c $<
$(INT_OBS): %.o: %.c
$(CC) -o $(OUT_SRC)$(notdir [email protected]) -MD -MP $(CPPFLAGS) $(CFLAGS) -c $<
-include $(ALL_DEPS)
clean:
rm -rf $(OUT_DIR) $(ALL_DEPS)
.PHONY: all clean
每當我做,它成功地創建了一個稱爲輸出與子目錄包含所有目標文件和輸出含有名爲微一個可執行源目錄。第一次,如果我使用它成功地創造一切條件,但如果我這樣做使再次,我希望它應該給化妝 - 無關但它建立的一切除了$(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作爲依賴於你的文件。 – mjr
您違反了[Makefiles規則]的規則2(http://make.mad-scientist.net/papers/rules-of-makefiles/)。您的規則會生成與目標名稱不匹配的文件。因爲這樣做**不能**知道你的目標是最新的,因爲它可以告訴你的目標文件**不存在**。 –
你看過你的.d文件嗎? – mjr