[英]Makefile: dynamic source file names and object directory
我目前正在嘗試通過使用sfml-framework構建我的c ++項目來改進makefile。 我的項目的文件夾結構當前如下所示:
我當前的makefile:
CC = g++ -g
SRC = Src/Source/
BIN = Bin/
INC = -I Lib/SFML/include/ -I Src/Header/
LIB = -L Lib/SFML/lib/ -lsfml-graphics-d -lsfml-window-d -lsfml-system-d
EXE = Test
SOURCEFILES = $(SRC)Main.cpp $(SRC)Menu.cpp $(SRC)Button.cpp
OBJ = $(SOURCEFILES:.cpp=.o)
all: $(SOURCEFILES) $(EXE)
$(EXE) : $(OBJ)
$(CC) -o $(BIN)$(EXE).exe $(OBJ) $(LIB)
.cpp.o:
$(CC) -c $< $(INC) -o $@
這個makefile可以正常工作,但是我有一些要改進的地方但是無法正常工作。
當前需要手動將所有cpp文件添加到源文件列表中。 由於該項目最有可能在文件數量方面快速增長,並且我有點想將源文件拆分到不同的子目錄中,所以這很快就會變得一團糟。 我試圖用$(通配符Src / Source / *。cpp)將所有cpp文件保存在目錄中,而不是單獨列出它們,但是它甚至無法執行makefile。 我在那里想念什么?
使用我當前的makefile,所有.o文件都與.cpp文件放在同一位置,這也是我真正不想要的東西。 有沒有一種方法可以將所有.o文件輸出到一個額外的\\ obj \\目錄中,然后從那里將其鏈接到.exe中?
另外,由於這是我第一次編寫makefile,如果對我的方法有一些一般性的改進,那么也請多多指教。
我有點驚訝通配符對您不起作用,您可以共享任何錯誤代碼?
通常我會這樣寫我的SRCS和OBJS變量:
SRCS = $(wildcard src/*.cpp) \
$(wildcard test/*.cpp)
OBJS = $(patsubst %.cpp,$(BINDIR)/%.o,$(SRCS))
並將目標文件構建到另一個目錄中,您可以編寫如下內容:
$(BINDIR)/%.o: %.cpp
$(CXX) $(CXXFLAGS) $(INCLUDES) -c $< -o $@
wildcard
應該工作:
SOURCEFILES = $(wildcard $(SRC)/*.cpp)
但是,如果您打算將源文件放在Src/Source/
各個子目錄中,它將無法正常工作。 多虧了shell
make函數,可以使用find
實用程序。 是的,您可以將所有目標文件存儲在單獨的目錄中:
CC = g++ -g SRC = Src/Source/ OBJ = Obj/ BIN = Bin/ INC = -I Lib/SFML/include/ -I Src/Header/ LIB = -L Lib/SFML/lib/ -lsfml-graphics-d -lsfml-window-d -lsfml-system-d EXE = $(BIN)Test.exe SOURCEFILES = $(shell find $(SRC) -type f -name *.cpp) OBJECTFILES = $(patsubst $(SRC)%.cpp,$(OBJ)%.o,$(SOURCEFILES)) all: $(SOURCEFILES) $(EXE) $(EXE): $(OBJECTFILE) $(CC) -o $@ $^ $(LIB) $(OBJ)%.o: $(SRC)%.cpp mkdir -p $(dir $@) $(CC) -c $< $(INC) -o $@
請注意,我還修改了您的EXE
定義,以使相應的規則是真實的文件到文件的生成規則,並使用$@
和$^
自動變量。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.