簡體   English   中英

Makefile:動態源文件名和對象目錄

[英]Makefile: dynamic source file names and object directory

我目前正在嘗試通過使用sfml-framework構建我的c ++項目來改進makefile。 我的項目的文件夾結構當前如下所示:

  • 頭文件的Src /頭
  • .cpp文件的Src /源
  • Bin / .exe
  • sfml庫的lib /

我當前的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可以正常工作,但是我有一些要改進的地方但是無法正常工作。

  1. 當前需要手動將所有cpp文件添加到源文件列表中。 由於該項目最有可能在文件數量方面快速增長,並且我有點想將源文件拆分到不同的子目錄中,所以這很快就會變得一團糟。 我試圖用$(通配符Src / Source / *。cpp)將所有cpp文件保存在目錄中,而不是單獨列出它們,但是它甚至無法執行makefile。 我在那里想念什么?

  2. 使用我當前的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 $@
  1. wildcard應該工作:

     SOURCEFILES = $(wildcard $(SRC)/*.cpp) 
  2. 但是,如果您打算將源文件放在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM