Я пытаюсь создать Makefile, чтобы генерировать объектные файлы в подкаталоге, а не пускать их в папку src /.Вот структура проекта:
Trunk
- Server
- src/
- include/
- Common
- src/
- include/
Makefile находится в Trunk/Server
.Исходные файлы расположены как в Server/src
, так и в Common/src
, поэтому в Makefile в настоящее время есть что-то вроде этого:
SRC = src/main.cpp \
src/Network.cpp \
../Common/src/SQLManager.cpp \
../Common/src/Utils.cpp
Я бы хотел поместить сгенерированные объектные файлы в соответствующие папки obj
, поэтому Trunk/Server/obj
и Trunk/Common/obj
.Как мне этого добиться?Я нашел много способов создания объектных файлов в подкаталогах (vpath
, patsubst
и многих других), но я не могу заставить ни один из них работать в этой организации папок.
Редактировать: Если естьспособ поместить все объектные файлы в Server/obj/
, это тоже было бы нормально.
Вот полный Makefile (за исключением некоторых исходных файлов и связанных библиотек): Edit2: Обновлено с изменениями Дидье Троссе
CXX = g++
RM = rm -vf
NAME = Server
SRC = src/main.cpp \
src/Network.cpp \
../Common/src/SQLManager.cpp \
../Common/src/Utils.cpp
OBJ = $(subst src/,obj/, $(subst .cpp,.o, $(SRC)))
LDFLAGS = -lpthread -lm
CPPFLAGS = -std=c++0x -pedantic -Wextra -Wall -Wconversion -Iinclude -I../Common/include
all: Server
%.o: %.cpp
$(CXX) $< -o $@
Server: $(OBJ)
$(CXX) -o $(NAME) $(OBJ) $(LDFLAGS)
clean:
$(RM) $(OBJ) *~
fclean: clean
$(RM) $(NAME)
re: fclean Server
.PHONY: all clean fclean Server