2013-06-18 4 views
0

Я адаптирую свой файл Makefile для поиска в 4 каталогах, а не в 2 (у него был один для исходных файлов и один для файлов заголовков, но я добавил новую папку для общего источника и включают). У меня есть что-то вроде следующим образом:Makefile: добавление второго каталога для файлов .h и .cpp

CC = g++ 
FLAGS = -g -c 

BUILDDIR = build 
INCLUDEDIR = -Icode/inc -I../common/code/inc -I/usr/include/libxml2 

SOURCEDIR = code/src ../common/code/src 
SOURCES = $(wildcard $(SOURCEDIR)/*.cpp) 
OBJECTS = $(patsubst $(SOURCEDIR)/%.cpp,$(BUILDDIR)/%.o,$(SOURCES)) 

EXECUTABLE = Exec 

all: $(BUILDDIR)/$(EXECUTABLE) 

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

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

Я пытался добавить одну запись в INCLUDEDIR следующим образом:

-I../common/code/inc 

И добавил ../common/code/src к SourceDir:

SOURCEDIR = code/src ../common/code/src 

В настоящее время это не работает, и мне интересно, как это исправить. Я получаю сообщение об ошибке:

Makefile:27: target `code/src' doesn't match the target pattern 

, но я не могу найти, как это исправить. Любая помощь будет оценена по достоинству.

EDIT: После выполнения Безумный учёный ответ ниже, я получаю следующий результат:

g++ -c -o code/src/Client.o code/src/Client.cpp 
code/src/Client.cpp:1:20: fatal error: Client.h: No such file or directory 
compilation terminated. 
make: *** [code/src/Client.o] Error 1 

Обновленный Makefile:

SOURCEDIR = code/src ../common/code/src 
SOURCES = $(wildcard $(addsuffix /*.cpp,$(SOURCEDIR))) 
OBJECTS = $(SOURCES:%.cpp=%.o) 

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

$(BUILDDIR)/%.o : ../common/code/src/%.cpp 
    $(CC) $(FLAGS) $< $(INCLUDEDIR) -o [email protected] -Wno-write-strings 

$(BUILDDIR)/%.o : code/src/%.cpp 
    $(CC) $(FLAGS) $< $(INCLUDEDIR) -o [email protected] -Wno-write-strings 

PS:

я был в состоянии исправить это с помощью следующие:

SOURCEDIR = code/src ../common/code/src 
SOURCES = $(wildcard $(addsuffix /*.cpp,$(SOURCEDIR))) 
TEMP_OBJ = $(SOURCES:%.cpp=%.o) 
NOT_DIR = $(notdir $(TEMP_OBJ)) 
OBJECTS = $(addprefix $(BUILDDIR)/, $(NOT_DIR)) 

ответ

1

Конечно, потому что теперь ваше статическое шаблонное правило расширяется:

$(OBJECTS): build/%.o : code/src ../common/code/src/%.cpp 

, который является незаконным синтаксисом. Если вы избегаете использования правил статического шаблона и вместо этого используете правила шаблонов, тогда он будет работать. Замените один статический шаблонное правило с правилами две модели:

$(BUILDDIR)/%.o : code/src/%.cpp 
     $(CC) $(FLAGS) $< $(INCLUDEDIR) -o [email protected] -Wno-write-strings 

$(BUILDDIR)/%.o : ../common/code/src/%.cpp 
     $(CC) $(FLAGS) $< $(INCLUDEDIR) -o [email protected] -Wno-write-strings 

EDIT: Вы также должны изменить другие виды применения SourceDir:

SOURCES = $(wildcard $(addsuffix /*.cpp,$(SOURCEDIR)) 
OBJECTS = $(patsubst %.cpp,$(BUILDDIR)/%.o,$(notdir $(SOURCES))) 
+0

Спасибо большое за помощь! Кажется, что он не пытается запустить эти два правила, он печатает: /usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/crt1.o: В функции '_start ': (.text + 0x20): неопределенная ссылка на« main ». Я попробовал добавить $ (ОБЪЕКТЫ). Нужно ли $ (ОБЪЕКТЫ)? ЭТО, похоже, не помогает. – user1777907

+0

Я бы подумал, что мне понадобится $ (BUILDDIR)/$ (EXECUTABLE): $ (BUILDDIR) /%. O, но я получаю «Нет правила, чтобы сделать цель' build /%. O ». Спасибо. – user1777907

+0

О, ваш patsubst тоже не прав. В основном везде, где вы использовали SOURCEDIR и ожидали, что он будет одним каталогом, его нужно изменить, чтобы разрешить использование нескольких каталогов. См. Отредактированный ответ. – MadScientist

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