Makefile配置问题:如何将.o文件输出至指定子文件夹?
正确配置Makefile实现.o文件归类
以下是修正后的Makefile,能把所有.o文件存入myObj子文件夹,同时在根目录生成myprog.out:
OBJDIR := myObj # 把所有目标文件统一放到myObj目录下 OBJS := $(addprefix $(OBJDIR)/, main.o otherfile.o) run: myprogram ./myprog.out myprogram: $(OBJS) gcc -o myprog.out $^ # 确保myObj目录存在,避免编译报错 $(OBJDIR): mkdir -p $@ # 从.c文件生成myObj下的.o文件,明确指定输出路径 $(OBJDIR)/%.o: %.c | $(OBJDIR) gcc -c $< -o $@ # 可选:添加清理规则,一键删除生成文件 clean: rm -rf $(OBJDIR) myprog.out
关键修改点说明
- 更新依赖路径:原来的
myprogram依赖根目录的main.o、otherfile.o,现在改成依赖myObj下的对应文件,让Make使用我们定义的模式规则 - 自动创建输出目录:新增
$(OBJDIR)目标,用mkdir -p确保目录存在;模式规则里的| $(OBJDIR)保证先建目录再编译 - 指定编译输出:模式规则里的
gcc命令加上-o $@,把编译结果直接输出到myObj文件夹($@就是当前规则要生成的myObj/xxx.o文件) - 简化链接命令:用
$^自动引用所有依赖的.o文件,不用手动逐个写,后续加新文件更方便
原修改无效的原因
- 依赖项没改:你还是让
myprogram依赖根目录的.o,Make会触发内置的编译规则生成根目录的.o,完全没用到你写的$(OBJDIR)/%.o规则 - 编译没指定输出:
gcc -c $<默认在当前目录生成.o,不会自动放到myObj,必须用-o明确指定输出路径
内容的提问来源于stack exchange,提问作者Lol Lol
相关产品推荐
相关产品推荐

