Генерация объектных файлов в подкаталоге с использованием Makefile - PullRequest
0 голосов
/ 13 февраля 2012

Я пытаюсь создать 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

Ответы [ 3 ]

3 голосов
/ 13 февраля 2012

С учетом этих определений subst следует использовать для замены части каталога src и расширения файла.

OBJ = $(subst src/,bin/,$(subst .cpp,.o,$(SRC)))

Затем вы должны добавить новые правила шаблонов для компиляции ваших исходных файлов. (Вы должны написать одно правило шаблона для каждого каталога, в котором находятся ваши исходные файлы.)

obj/%.o: src/%.cpp
         $(CXX) -c $< -o $@

../Common/obj/%.o: ../Common/src/%.cpp
         $(CXX) -c $< -o $@
0 голосов
/ 14 февраля 2012

Не совсем точно, что вы пытаетесь сделать, но это должно быть близко:

OBJ = $(subst src/,obj/,$(SRC:.cpp=.o))

obj/%.o : src/%.cpp
    $(CXX) $< -o $@

../Common/obj/%.o : ../Common/src/%.cpp
    $(CXX) $< -o $@
0 голосов
/ 13 февраля 2012

Я не уверен, что это будет работать, но я бы попробовал что-то вроде:

OBJ := $(join $(addsuffix ../obj/,$(dir $(SRC))),$(notdir $(SRC))
# or, as Didier suggested:
# OBJ := $(subst src/,obj/,$(SRC))

%.o: ../src/%.cpp
    $(CXX) $< -o $@
...