You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在多可执行文件的Makefile中为单个目标指定宏定义与独立obj目录

优雅实现共享源文件的多目标编译方案

核心思路是利用Make的目标特定变量和模式规则,既能区分两个程序的编译参数与目标文件路径,又避免冗余代码。以下是完整的可复用方案:

完整Makefile示例

# 通用配置:共享的源文件列表(根据你的实际路径调整)
SRCS := src/game_logic.c src/render.c src/ui.c src/utils.c

# 通用编译参数(基础警告、优化、头文件路径等)
COMMON_CFLAGS := -Wall -Wextra -O2 -Iinclude

# 默认目标:编译Program1.exe(游戏)
all: Program1.exe

# Program1的专属配置:目标文件目录、编译参数
Program1.exe: OBJ_DIR := .obj
Program1.exe: CFLAGS := $(COMMON_CFLAGS)
Program1.exe: $(patsubst src/%.c, $(OBJ_DIR)/%.o, $(SRCS))
	$(CC) $^ -o $@

# 编译Program2.exe(编辑器)的目标:执行make two触发
two: Program2.exe

# Program2的专属配置:目标文件目录、带DEDITOR宏的编译参数
Program2.exe: OBJ_DIR := .obj/editor
Program2.exe: CFLAGS := $(COMMON_CFLAGS) -DEDITOR
Program2.exe: $(patsubst src/%.c, $(OBJ_DIR)/%.o, $(SRCS))
	$(CC) $^ -o $@

# 模式规则:自动将src下的.c文件编译到对应OBJ_DIR的.o文件
$(OBJ_DIR)/%.o: src/%.c
	@mkdir -p $(@D)  # 自动创建目标目录(不存在时)
	$(CC) $(CFLAGS) -c $< -o $@

# 清理所有生成文件
clean:
	rm -rf .obj Program1.exe Program2.exe

关键细节说明

  • 目标特定变量:Program1.exe: OBJ_DIR := .obj 这种语法只会让变量作用于对应目标及其依赖规则,不会干扰另一个程序的编译,完美解决了全局修改CFLAGS的冲突问题。
  • 模式规则:$(OBJ_DIR)/%.o: src/%.c 自动匹配所有共享源文件,生成对应目录的目标文件,无需手动逐个编写编译规则,彻底避免冗余。
  • 宏定义时机:把-DEDITOR放在CFLAGS中,确保在编译预处理阶段生效(链接阶段加宏无效,因为预处理已完成)。
  • 自动创建目录:@mkdir -p $(@D) 会自动生成目标文件所在的层级目录,不用手动提前创建。

使用方式

  • 编译游戏(Program1.exe):直接执行 make
  • 编译编辑器(Program2.exe):执行 make two
  • 清理所有生成文件:执行 make clean

内容的提问来源于stack exchange,提问作者Askalot

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 16:52:19