Make
Makefile 編譯未更改的文件
努力在另一個目錄中獲取目標文件,但該目錄將反映源目錄樹。讓它工作了,但是該
$(OBJ):
行缺少一塊(對嗎?),所以無論您是否更改原始碼,它都會重新編譯。看一看。SRC_PATH=../src/ CC=g++ CFLAGS=-c -Wall LDFLAGS=-lSDL -lSDL_gfx INCL=-I $(SRC_PATH)include/ EXE=run SRC=$(wildcard $(SRC_PATH)*.cpp $(SRC_PATH)game/*.cpp $(SRC_PATH)player/*.cpp) OBJ=$(subst ../src, ../obj, $(SRC:.cpp=)) OBJ_O=$(addsuffix .o, $(OBJ)) all: $(SRC) $(EXE) $(EXE): $(OBJ) $(CC) $(LDFLAGS) $(OBJ_O) -o $@ $(OBJ): $(CC) $(CFLAGS) $(INCL) -o $(addsuffix .o, $@) $(subst ../obj, ../src, $@).cpp clean: rm -rf run $(OBJ_O)
編輯
這按預期工作:不重新編譯。此外,沒有復雜的後綴來回更容易閱讀。請參閱下面的答案和評論。
SRC_PATH=../src/ CC=g++ CFLAGS=-c -Wall LDFLAGS=-lSDL -lSDL_gfx INCL=-I $(SRC_PATH)include/ EXE=run SRC=$(wildcard $(SRC_PATH)*.cpp $(SRC_PATH)game/*.cpp $(SRC_PATH)player/*.cpp) OBJ=$(subst ../src, ../obj, $(SRC:.cpp=.o)) all: $(SRC) $(EXE) $(EXE): $(OBJ) $(CC) $(LDFLAGS) $(OBJ) -o $@ ../obj/%.o: ../src/%.cpp $(CC) $(CFLAGS) $(INCL) -o $@ $< clean: rm -rf run $(OBJ)
有幾個問題:
首先,您的 OBJ 變數不引用已建構的文件列表。例如,當您有源文件 src/a.cpp 和 src/b.cpp 時,OBJ 將包含 obj/a 和 obj/b。所以用 OBJ_O 代替 OBJ。
其次,您建構 OBJ 文件的目標不提供 .cpp 和 .o 文件之間的依賴關係。以這種方式編寫創建 .o 文件的規則是一個問題,因為您不能在該行中提供依賴資訊。我會完全重寫創建 .o 文件的規則:
../obj/%.o: ../src/%.cpp $(CC) $(CFLAGS) $(INCL) -o "$@" "$<"
這會分別建構每個 .o 文件,每個 .o 文件都依賴於對應的 .cpp 文件。
../obj/**.o
這是從每個匹配的文件創建文件的規則../src/**.cpp
。