- 定义变量指定输出目录
- 在
Makefile
中,首先定义一个变量来指定编译文件存放的目标文件夹。例如,假设你想将编译生成的目标文件(.o
文件)和最终可执行文件都放在build
文件夹中。
# 定义输出目录变量 BUILD_DIR = build
- 在
- 修改目标文件生成规则
- 对于生成目标文件(
.o
文件)的规则,要确保将其生成到指定的BUILD_DIR
目录下。假设源文件在src
目录,并且以.c
文件为例。
# 定义源文件目录 SRC_DIR = src # 获取所有源文件 SRCS := $(wildcard $(SRC_DIR)/*.c) # 定义目标文件,通过patsubst函数将源文件路径转换为目标文件路径,并放在BUILD_DIR下 OBJS := $(patsubst $(SRC_DIR)/%.c,$(BUILD_DIR)/%.o,$(SRCS)) $(BUILD_DIR)/%.o: $(SRC_DIR)/%.c @mkdir -p $(@D) $(CC) $(CFLAGS) -c $< -o $@
- 这里
$(BUILD_DIR)/%.o: $(SRC_DIR)/%.c
是规则,表示如何从src
目录下的源文件生成build
目录下的目标文件。@mkdir -p $(@D)
确保目标文件所在的目录($(@D)
表示目标文件的目录部分)存在,如果不存在则创建。$(CC) $(CFLAGS) -c $< -o $@
使用编译器($(CC)
)和编译选项($(CFLAGS)
)编译源文件($<
)并生成目标文件($@
)。
- 对于生成目标文件(
- 修改最终可执行文件生成规则
- 如果要生成可执行文件,同样要将其放在
BUILD_DIR
目录下。假设最终可执行文件名为my_program
。
# 定义最终可执行文件 TARGET = $(BUILD_DIR)/my_program $(TARGET): $(OBJS) $(CC) $(OBJS) -o $@
- 这里
$(TARGET): $(OBJS)
规则表示如何从目标文件链接生成最终的可执行文件,并将其放在BUILD_DIR
目录下。$(CC) $(OBJS) -o $@
使用编译器链接所有目标文件($(OBJS)
)生成可执行文件($@
)。
- 如果要生成可执行文件,同样要将其放在
- 完整示例
Makefile
# 定义编译器,这里假设为GCC CC = gcc # 定义编译选项, -Wall表示开启所有警告, -g表示包含调试信息 CFLAGS = -Wall -g # 定义输出目录变量 BUILD_DIR = build # 定义源文件目录 SRC_DIR = src # 获取所有源文件 SRCS := $(wildcard $(SRC_DIR)/*.c) # 定义目标文件,通过patsubst函数将源文件路径转换为目标文件路径,并放在BUILD_DIR下 OBJS := $(patsubst $(SRC_DIR)/%.c,$(BUILD_DIR)/%.o,$(SRCS)) # 定义最终可执行文件 TARGET = $(BUILD_DIR)/my_program $(BUILD_DIR)/%.o: $(SRC_DIR)/%.c @mkdir -p $(@D) $(CC) $(CFLAGS) -c $< -o $@ $(TARGET): $(OBJS) $(CC) $(OBJS) -o $@ all: $(TARGET) clean: -rm -rf $(BUILD_DIR)
- 在这个完整的
Makefile
中,all
目标依赖于$(TARGET)
,即执行make all
时会在build
目录下生成可执行文件。clean
目标用于清理build
目录及其所有内容。
- 在这个完整的
通过以上步骤,就可以将编译生成的文件都放在同一个指定的文件夹中。如果项目涉及库文件等其他类型的编译产物,也可以按照类似的方式将其生成到指定目录。