如何编写Makefile为src目录每个.c文件生成可执行文件到exec目录
问题原因
- 原有代码中
$(SRC_FILES:.c=)替换后的目标是带src/前缀的路径(例如src/main),和你要生成的exec/目录下的目标路径不匹配 - Make内置的
.c生成可执行文件的隐式规则优先级高于你自定义的后缀规则,你的自定义规则没有生效,因此可执行文件默认生成到了src目录下
修正后的Makefile代码
CFLAGS := -Wall -g SRC_DIR := src EXEC_DIR := exec # 获取src目录下所有.c文件 SRC_FILES := $(wildcard $(SRC_DIR)/*.c) # 转换为exec目录下对应的可执行文件路径,如src/main.c -> exec/main EXEC_TARGETS := $(patsubst $(SRC_DIR)/%.c, $(EXEC_DIR)/%, $(SRC_FILES)) # 默认编译目标:生成所有可执行文件 all: $(EXEC_TARGETS) # 模式规则:指定exec下的可执行文件对应src下的同名.c文件 $(EXEC_DIR)/%: $(SRC_DIR)/%.c | $(EXEC_DIR) gcc $(CFLAGS) $< -o $@ # 自动创建exec目录,避免目录不存在报错 $(EXEC_DIR): mkdir -p $@ # 清理规则:删除所有生成的可执行文件 clean: rm -rf $(EXEC_DIR)
关键修改说明
- 新增
EXEC_TARGETS变量,直接把源文件路径映射为最终要生成的带exec目录前缀的目标路径,避免路径匹配错误 - 用显式模式规则替代原来的后缀规则,明确指定目标和依赖的路径对应关系,绕过Make内置隐式规则
- 增加exec目录的自动创建逻辑,无需手动提前创建目录
- 新增clean规则,方便一键清理生成的产物
使用方法
- 执行
make即可在exec目录下生成所有对应可执行文件 - 执行
make clean即可删除exec目录下所有生成的内容
内容的提问来源于stack exchange,提问作者Achraf Ben Soltane
相关产品推荐
相关产品推荐

