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