2016-10-03 68 views
2

請注意,在SO上也有類似的問題,但我認爲我的情況不同,而且我的Makefile非常簡單直接。我是Makefile的新手。makefile編譯所有文件而不是最後編輯的文件

假設我需要編譯一個項目,看起來像這樣 -

. 
├── [4.0K] bin 
├── [ 517] Makefile 
├── [4.0K] obj 
└── [4.0K] src 
    ├── [ 117] func1.cpp 
    ├── [ 76] func2.cpp 
    ├── [ 137] global.h 
    └── [ 97] main1.cpp 

和我的Makefile文件看起來像這樣 -

CC   := g++ 
CFLAGS  := -g -Wall -std=c++0x 
LDFLAGS  := -lm 

NAMES := func1.cpp func2.cpp main1.cpp 
SRC  := $(addprefix src/,$(NAMES)) 
OBJ  := $(addprefix obj/,$(NAMES:.cpp=.o)) 
DEPS := $(OBJ:.o=.d) 

.PHONY: clean all debug 

all: prog 

debug: 
    $(info $$SRC: ${SRC}) 
    $(info $$OBJ: ${OBJ}) 
    $(info $$DEPS: ${DEPS}) 

prog: bin/prog 

bin/prog: $(OBJ) 
    $(CC) $^ -o [email protected] 

$(OBJ): $(SRC) 
    $(CC) $(CFLAGS) -I/src/global.h -c $(addprefix src/,$(notdir $(@:.o=.cpp))) -o [email protected] 

-include $(DEPS) 

clean: 
    rm -rf bin/* 
    rm -rf obj/* 

假設我打開的文件func1.cpp並作了一些修改。當我調用make它編譯所有文件,但它應該只編譯一個(func1.cpp)。

我該如何解決這個問題?

注:我需要progbin/prog出於不同的原因,也是我無法做到像obj/%.o: src/%.c食譜,因爲我可能有不同的目標來自同一對象的子集。

+2

可能的重複[如何使Makefile重新編譯僅更改的文件?](http://stackoverflow.com/questions/7815400/how-do-i-make-makefile-to-recompile-only-changed-文件) – Xirema

+0

我懷疑你只需要添加'-MMD -MP'到你的'CFLAGS'。或者,也許只是你的'$(OBJ):$(SRC)'目標的命令。 – Galik

回答

5

當你寫這樣一個規則:

$(OBJ): $(SRC) 
    cmd 

而你的情況是

obj/func1.o obj/func2.o obj/main.o : src/func1.cpp src/func2.cpp src/main1.cpp 
    cmd 

的先決條件沒有得到跨越拉鍊。這爲每個目標生成一個規則,並具備所有先決條件。那就是:

obj/func1.o : src/func1.cpp src/func2.cpp src/main1.cpp 
    cmd 

obj/func2.o : src/func1.cpp src/func2.cpp src/main1.cpp 
    cmd 

obj/main.o : src/func1.cpp src/func2.cpp src/main1.cpp 
    cmd 

由於src/func1.cpp是所有目標文件的前提條件,他們都得到重新編譯。

你想要什麼,而不是是使用static pattern rule

obj/%.o : src/%.cpp 
    $(CC) $(CFLAGS) -I/src -c $< -o [email protected]   

注意-I是包括目錄,不包括文件。