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

如何通过Makefile创建obj/目录并存放编译产物?

解决方案

要实现自动创建obj/目录并将编译产物放入其中,只需对原Makefile做3处关键修改:

  1. 调整目标程序的输出路径:让最终生成的程序直接输出到obj/目录下
  2. 添加自动创建obj/目录的规则:确保编译前目录已存在,避免因目录缺失导致编译失败
  3. 更新清理规则:适配新的产物路径,保证能正确删除所有生成文件

修改后的完整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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 02:40:32