Make

Makefile 編譯未更改的文件

  • March 17, 2018

努力在另一個目錄中獲取目標文件,但該目錄將反映源目錄樹。讓它工作了,但是該$(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

引用自:https://unix.stackexchange.com/questions/42769