使用 make 将对象文件放在特定目录中



我一直在研究使用 make 构建 cpp 应用程序并在线查看各种资源。当它工作时,我正在尝试构建我的目标文件并将其放入特定目录中,而不是让它们进入与我的源文件相同的 src/。理想情况下,我希望它们进入OUT_O_DIR位置,但它们正在生成并放置在 src/中,这是我不想要的。

我想要这样的结构:

.
|- Makefile
|- include/
| |- *.h
|- src/
| |- *.c
|- output/
| |- App
|- obj/
| |- *.o

我的品牌版本:

GNU Make 4.1
Built for x86_64-pc-linux-gnu

我的制作文件:

OUT_O_DIR := $(OUT_DIR)/obj
PROJ = hello
SOURCE = $(wildcard src/*.cpp)
INC = $(wildcard include/*.h)
OBJS = $(SOURCE:.cpp=.o)
CFLAGS = -I include
CC = g++
.PHONY: directories
all :   directories $(OUT_DIR)$(PROJ)
directories:    $(OUT_DIR)
$(OUT_DIR)$(PROJ) : $(OBJS)
$(CC) -o $@ $(OBJS)
.cpp.o: $(INC)
@echo $@    
$(CC) -c $(CFLAGS) $< -o $@ 
clean :
rm -rf $(OUT_DIR)
$(OUT_DIR): 
mkdir -p $(OUT_DIR)

".cpp.o"不会扩展到涵盖多个文件夹。两个选项

修改 OBJS 和规则以构建对象。

#OBJS = $(SOURCE:.cpp=.o)
OBJS = $(SOURCE:src/%.cpp=$(OUT_O_DIR)/%.o)
...
#.cpp.o: $(INC)
${OUT_O_DIR}/%.o: src/%.cpp $(INC)
$(CC) -c $(CFLAGS) $< -o $@

或者使用 vpath 指定 src 中的.cpp

文件
#OBJS = $(SOURCE:.cpp=.o)
OBJS = $(SOURCE:src/%.cpp=$(OUT_O_DIR)/%.o)
vpath %.cpp src
${OUT_O_DIR}/%.o: %.cpp $(INC)
$(CC) -c $(CFLAGS) $< -o $@