如何通过Makefile创建obj/目录并存放编译产物?
解决方案
要实现自动创建obj/目录并将编译产物放入其中,只需对原Makefile做3处关键修改:
- 调整目标程序的输出路径:让最终生成的程序直接输出到
obj/目录下 - 添加自动创建
obj/目录的规则:确保编译前目录已存在,避免因目录缺失导致编译失败 - 更新清理规则:适配新的产物路径,保证能正确删除所有生成文件
修改后的完整Makefile代码如下:
TARGET = obj/lab-01_makefile CC = gcc PREF_SRC = ./src/ PREF_OBJ = ./obj/ SRC = $(wildcard $(PREF_SRC)*.c) OBJ = $(patsubst $(PREF_SRC)%.c, $(PREF_OBJ)%.o, $(SRC)) # 自动创建obj目录,-p参数避免目录已存在时报错 $(PREF_OBJ): mkdir -p $@ # 目标程序依赖obj目录和所有.o文件 $(TARGET) : $(PREF_OBJ) $(OBJ) $(CC) $(OBJ) -I include -o $(TARGET) # .o文件编译规则,依赖对应.c文件和obj目录 $(PREF_OBJ)%.o : $(PREF_SRC)%.c $(PREF_OBJ) $(CC) -c $< -I include -o $@ clean : rm -f $(TARGET) $(PREF_OBJ)*.o # 可选:如果需要彻底删除obj目录,取消下面一行注释 # rm -rf $(PREF_OBJ)
改动细节说明
- 目录创建逻辑:新增的
$(PREF_OBJ)规则会在编译前自动执行mkdir -p obj/,无论目录是否已存在都不会触发报错 - 产物路径调整:将
TARGET变量从lab-01_makefile改为obj/lab-01_makefile,确保最终程序直接生成在目标目录中 - 依赖关系完善:让目标程序和所有
.o文件都依赖于obj/目录,从根源上避免编译时因目录缺失导致的错误 - 清理命令优化:使用
rm -f避免删除不存在文件时的报错,可选的rm -rf $(PREF_OBJ)可以彻底清除整个obj/目录
内容的提问来源于stack exchange,提问作者xliudzyh
相关产品推荐
相关产品推荐

