2016-12-12 3 views
1

Я сейчас работаю над проектом SDL2 и каталог структурирован следующим образомУскорение Makefile для SDL2

./ 
|__assets 
| |__*.png 
|__src 
| |__physcis 
|  |_*.cpp *.hpp 
| |__textures 
|  |_obstacles 
|   |_*.cpp *.hpp 
|  |_constants 
|   |_*.cpp *.hpp 
| 
|__Makefile 

В настоящее время мой Makefile имеет очень простую структуру Makefile:

ROOTDIR=src/ 
TXTURDIR = src/textures/constant/ 
OBSTACLEDIR = src/textures/obstacles/ 
PHYSDIR = src/physics/ 
OBJS = $(ROOTDIR)Main.cpp \ 
      $(ROOTDIR)WindowInit.cpp \ 
      $(ROOTDIR)Timer.cpp \ 
      $(ROOTDIR)GameLoop.cpp \ 
      $(PHYSDIR)Gravity.cpp \ 
      $(TXTURDIR)Texture.cpp \ 
      $(TXTURDIR)TextureContainer.cpp \ 
      $(TXTURDIR)Ball.cpp \ 
      $(TXTURDIR)Bob.cpp \ 
      $(TXTURDIR)Text.cpp \ 
      $(TXTURDIR)ScoreCounter.cpp \ 
      $(TXTURDIR)FPSCounter.cpp 

CC = g++ 

COMPILER_FLAGS = -g -o 

LINKER_FLAGS = -lSDL2 -lSDL2_image -lSDL2_ttf 
OUT = exe 

all: $(OUT) 
$(OUT): $(OBJS) 
    $(CC) $(COMPILER_FLAGS) [email protected] $^ ${LINKER_FLAGS} 

clean: 
    rm exe 

Есть ли способ ускорить процесс создания, только скомпилировав определенные папки при изменении, а затем связав скомпилированные разделы вместе?

ответ

1

Да, это точная вещь, которую предназначены Makefiles. Вот набор изменений в вашем существующем Makefile, который сделает это:

Измените переменную OBJS, чтобы ссылаться на файлы .o вместо .cpp. Это превратит существующее правило компиляции в правило ссылки.

OBJS = $(ROOTDIR)Main.o \ 
     $(ROOTDIR)WindowInit.o \ 
     $(ROOTDIR)Timer.o \ 
     # ... etc ... 

Make уже знает, как создать .o файлы из .cpp файлов, благодаря встроенному в наборе implicit rules. Тем не менее, вам нужно настроить имена переменных конфигурации на то, что ожидает неявные правила Make. Не помещайте опцию -o в флагов компилятора, Make добавит это сам.

# _instead of_ setting CC, COMPILER_FLAGS, LINKER_FLAGS 
CXX = g++ 
CXXFLAGS = -g 
LIBS = -lSDL2 -lSDL2_image -lSDL2_ttf 

Отрегулируйте правило связи в соответствии с именами скорректированных переменных. (Вы не имеете CPPFLAGS прямо сейчас, но вы можете его в будущем.)

$(OUT): $(OBJS) 
     $(CXX) $(CXXFLAGS) $(CPPFLAGS) -o [email protected] $^ $(LIBS) 

В нижней части файла добавьте набор правил без рецептов, с указанием индивидуальных зависимостей каждого объектный файл. Это то, как вы упорядочиваете вещи, которые нужно перестроить, когда вы меняете заголовочные файлы, а также работает вокруг недоработки, где иногда Make будет удалять объектные файлы сразу после их использования. (Для проекта такого размера, что легче отслеживать, какие исходные файлы использовать которые файлы заголовков вручную. Когда он получает достаточно большой, что вы хотите иметь компьютерную сделку с этим для вас, смотрите в automake.)

$(ROOTDIR)Main.o: $(ROOTDIR)Main.cpp foo.h bar.h 
$(ROOTDIR)WindowInit.o: $(ROOTDIR)WindowInit.cpp foo.h bar.h 
# ... etc ... 

Измените цель clean, чтобы очистить объектные файлы (и пока вы на ней используете -rm -f вместо голых rm).

clean: 
     -rm -f $(OUT) $(OBJS) 

Добавить .PHONY аннотацию в самом низу файла: это не является строго необходимым, но предотвратит странные вещи случиться, если вы когда-либо файл с именем «все» или «чистый» по какой-то причине:

.PHONY: all clean 

И все, все готово.

+0

Это такой отличный ответ! Престижность! – WhosSu

Смежные вопросы