2013-06-04 7 views
6

Я пытаюсь использовать Makefile, чтобы собрать кучу .cpp файлов, расположенных в src/code/*.cpp, затем компилировать каждый *.o в build/, и, наконец, генерировать исполняемый файл с теми, в build/ а.Makefile: Компиляция из каталога в другой каталог

Я прочитал пару ответов, с которыми я пытался работать, но столкнулся с проблемами, которые я не понимаю.

CC = g++ 
FLAGS = -g -c 

SOURCEDIR = /src/code 
BUILDDIR = build 

EXECUTABLE = DesktopSpecificController 
SOURCES = $(wildcard src/code/*.cpp) 
OBJECTS = $(patsubst src/code/*.cpp,build/%.o,$(SOURCES)) 

all: dir $(BUILDDIR)/$(EXECUTABLE) 

dir: 
    mkdir -p $(BUILDDIR) 

$(BUILDDIR)/$(EXECUTABLE): $(OBJECTS) 
    $(CC) $^ -o [email protected] 

$(OBJECTS): $(BUILDDIR)/%.o : $(SOURCEDIR)/%.cpp 
    $(CC) $(FLAGS) $< -o [email protected] 

clean: 
    rm -f $(BUILDDIR)/*o $(BUILDDIR)/$(EXECUTABLE) 

Я получаю следующее сообщение об ошибке, и я не знаю, почему:

Makefile:19: target `src/code/main.cpp' doesn't match the target pattern 

Я также вижу, что при попытке построить Исполняемый, не используя .o файлы, так что это кажется, мое правило не так.

+0

Просто обновил свой Makefile немного. – user1777907

ответ

8

Неверная функция patsubst; вы не можете использовать подстановочные символы оболочки, такие как *. Вы хотите:

OBJECTS = $(patsubst $(SOURCEDIR)/%.cpp,$(BUILDDIR)/%.o,$(SOURCES)) 

Также вы должны использовать SOURCEDIR и BUILDDIR везде, а не только в некоторых местах (в противном случае вы получите несоответствие). И, наконец, ваше значение SourceDir неправильно: он не должен начинаться с / я ожидаю:

SOURCEDIR = src/code 

SOURCES = $(wildcard $(SOURCEDIR)/*.cpp) 
+0

Большое спасибо! Вы исправили мою проблему, теперь она работает :) Большое спасибо! – user1777907

+1

Добро пожаловать. Не забывайте, что SO должен быть одним из ваших последних курортов, после того, как вы попытались это самостоятельно решить. Вот несколько советов по отладке makefile: во-первых, опция '-p' будет выводить всю базу данных make, включая все значения всех переменных. Кроме того, в GNU вы можете использовать функцию '$ (info ...)' для печати информации, такой как значения переменных. Печать этих значений позволила бы вам понять, где проблема. – MadScientist

+2

Чтобы уточнить предложение MadScientist, '$ (info ...)' можно использовать как '$ (info $ (SOURCES))', например. Его можно вставить сразу же после определения интересующей переменной. –

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