如何在构建目录中生成目标文件?

How to generate object files in the build directory?

我目前正在开发一个 C 项目来实现 Linux 用户空间应用程序。 我写了这个 Makefile,它允许我编译 :

PROJ_DIR := ../
SRC_DIR := $(PROJ_DIR)/src
BUILD_DIR := $(PROJ_DIR)/build

# define the executable file
TARGET := tcp_proxy

# include paths list
INC_DIRS := $(SRC_DIR)
INC_DIRS += $(SRC_DIR)/rpmsg
INC_DIRS += $(SRC_DIR)/rpmsg/rx
INC_DIRS += $(SRC_DIR)/rpmsg/tx
INC_DIRS += $(SRC_DIR)/tcp
INC_DIRS += $(SRC_DIR)/tcp/rx
INC_DIRS += $(SRC_DIR)/tcp/tx

INC_FLAGS := $(addprefix -I,$(INC_DIRS))

# source file list
SRCS := $(shell find $(SRC_DIR) -name *.c)

# object file list
OBJS := $(SRCS:.c=.o)

LDFLAGS := -pthread

all: tcp_proxy

tcp_proxy: $(OBJS)
    $(CC) $(CFLAGS) $(INC_FLAGS) -o $(TARGET) $(OBJS) $(LDFLAGS)

%.o: %.c
    $(CC) $(CFLAGS) $(INC_FLAGS) -c $< -o $@

.PHONY: clean

clean:
    $(RM) *.o *~ $(TARGET)

但是,目标文件是在与源文件相同的位置生成的。 所以我想知道如何在“build”目录中复制“src”下的文件夹并在该目录中生成目标文件和可执行文件。

我还希望在执行 make clean 时能够删除所有目标文件和可执行文件。

我的项目:

搜索肯定会找到很多这方面的示例和信息。

首先告诉make你要构建什么对象;将 OBJS 的设置更改为:

# object file list
OBJS := $(SRCS:$(SRC_DIR)/%.c=$(OBJ_DIR)/%.o)

然后告诉make如何构建它;将构建对象的模式规则更改为:

$(OBJ_DIR)/%.o: $(SRC_DIR)/%.c
        @mkdir -p $(@D)
        $(CC) $(CFLAGS) $(INC_FLAGS) -c $< -o $@