Подтвердить что ты не робот

GNU Создайте шаблон для создания вывода в разных каталогах, чем src

Я пытаюсь создать Makefile, который помещает мои файлы .o в другой каталог, чем мои исходные файлы. Я пытаюсь использовать правило шаблона, поэтому мне не нужно создавать одинаковые правила для каждого исходного и объектного файла.

Моя структура проекта выглядит примерно так:

project/
 + Makefile
 + src/
   + main.cpp
   + video.cpp
 + Debug/
   + src/       [contents built via Makefile:]
     + main.o
     + video.o

My Makefile выглядит примерно так:

OBJDIR_DEBUG = Debug
OBJ_DEBUG = $(OBJDIR_DEBUG)/src/main.o $(OBJDIR_DEBUG)/src/video.o

all: $(OBJ_DEBUG)

$(OBJ_DEBUG): %.o: %.cpp
    $(CXX) $(CFLAGS_DEBUG) $(INC_DEBUG) -c $< -o [email protected]

Это не работает, потому что он ищет исходные файлы в Debug/src/*.cpp.

Я пробовал следующее:

# Broken: make: *** No rule to make target `Debug/src/main.cpp', needed by `Debug/src/main.o'.  Stop.
# As a test, works if I change "%.cpp" to "Debug/src/main.cpp", though it obv. builds the wrong thing

# Strip OBJDIR_DEBUG from the start of source files
$(OBJ_DEBUG): %.o: $(patsubst $(OBJDIR_DEBUG)/%,%,%.cpp)
    $(CXX) $(CFLAGS_DEBUG) $(INC_DEBUG) -c $< -o [email protected]

# Broken:
#   Makefile:70: target `src/main.o' doesn't match the target pattern
#   Makefile:70: target `src/video.o' doesn't match the target pattern

# Add OBJDIR_DEBUG in target rule
OBJ = src/main.o src/video.o

$(OBJ): $(OBJDIR_DEBUG)/%.o: %.cpp
    $(CXX) $(CFLAGS_DEBUG) $(INC_DEBUG) -c $< -o [email protected]
4b9b3361

Ответ 1

После повторного чтения документации по правилам статического шаблона я получил следующее правило шаблонов, которое, похоже, работает.

$(OBJ_DEBUG): $(OBJDIR_DEBUG)/%.o: %.cpp
    $(CXX) $(CFLAGS_DEBUG) $(INC_DEBUG) -c $< -o [email protected]

Я не уверен, что это лучший подход, и я открыт для предложений.

Ответ 2

Вместо того, чтобы создавать объекты в другом каталоге, вы можете попытаться создать объекты из источников в другом каталоге: поместите свой makefile в каталог, где будут объекты, и попросите искать источники в другом месте, используя VPATH. Это лучше всего работает, если все объектные файлы должны находиться в одном каталоге.

Ответ 3

Makefile, который "дублирует" исходное дерево в отдельном каталоге сборки, запуская GCC для каждого источника - fooobar.com/info/217460/...