Makefile: динамические имена исходных файлов и каталог объектов - PullRequest
0 голосов
/ 10 октября 2018

В настоящее время я пытаюсь улучшить make-файл, который я использую для сборки своего проекта на c ++ с использованием sfml-framework.Структура папок моего проекта в настоящее время выглядит следующим образом:

  • Src / Header для заголовочных файлов
  • Src / Source для .cpp Files
  • Bin / для.exe
  • Lib / для библиотеки sfml

Мой текущий make-файл:

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 $@

Этот make-файл работает нормально, однако я хотел бы кое-что сделатьулучшить, но не смог приступить к работе.

  1. В настоящее время необязательно добавлять все файлы cpp вручную в список исходных файлов.Поскольку проект, скорее всего, будет быстро расти с точки зрения количества файлов, и я хочу разделить исходные файлы на разные подкаталоги, это очень скоро станет неразберихой.Я попытался получить все файлы cpp в каталоге с $ (подстановочный знак Src / Source / *. Cpp) вместо того, чтобы перечислять их по отдельности, но он даже не смог выполнить make-файл.Чего мне там не хватает?

  2. С моим текущим make-файлом все .o-файлы помещаются в то же место, что и .cpp-файл, что мне тоже не очень нужно.Есть ли способ вывести все файлы .o в дополнительный каталог \ obj \ и связать его с .exe оттуда?

Кроме того, так как я пишу make-файл впервые, яесли есть какие-то общие улучшения в моем подходе, то любой совет приветствуется.

Ответы [ 2 ]

0 голосов
/ 10 октября 2018
  1. wildcard должно работать:

    SOURCEFILES = $(wildcard $(SRC)/*.cpp)
    
  2. Но если вы планируете размещать ваши исходные файлы в различных подкаталогах Src/Source/, это не будетработать хорошоВместо этого используйте утилиту find, благодаря функции shell make.И да, вы можете хранить все ваши объектные файлы в отдельном каталоге:

    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 так, что соответствующее правило является реальным файлом.Создает правило make и использует автоматические переменные $@ и $^.

0 голосов
/ 10 октября 2018

Я немного удивлен, что подстановочный знак не работает для вас, какие-либо коды ошибок, которыми вы могли бы поделиться?
Обычно я записываю свои переменные SRCS и OBJS так:

SRCS = $(wildcard src/*.cpp) \
       $(wildcard test/*.cpp)
OBJS = $(patsubst %.cpp,$(BINDIR)/%.o,$(SRCS))

И для сборкиваши объектные файлы в другой каталог вы можете написать что-то вроде этого:

$(BINDIR)/%.o: %.cpp
    $(CXX) $(CXXFLAGS) $(INCLUDES) -c $< -o $@
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...