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

多子目录下Makefile编译报错无法找到*.o文件该如何解决

Makefile编译报错修复方案

错误根因

  • 模式规则%.o :未关联.c依赖,make无法匹配到源文件触发编译逻辑,所有.o文件没有生成,导致链接阶段找不到obj目录下的目标文件
  • 没有校验obj、bin目录是否存在的逻辑,目录缺失时文件输出、mv操作都会失败
  • 单个.o目标的依赖声明后未绑定编译动作,make无法自动调用通用规则生成目标文件

修复后的完整Makefile

CFLAGS = -g -Wall
IFLAGS = -Iinclude
OPATH = obj/
BPATH = bin/
CPATH = src/

# 自动创建缺失的存储目录
$(shell mkdir -p $(OPATH) $(BPATH))

vpath %.h include
vpath %.c src
vpath %.o obj
vpath main bin

main: main.o grille.o io.o jeu.o
	gcc $(CFLAGS) -o $(BPATH)$@ $(addprefix $(OPATH),$^)

# 单个.o文件的依赖声明
main.o: main.c grille.h io.h jeu.h
grille.o : grille.c grille.h
io.o: io.c io.h
jeu.o: jeu.c jeu.h

# 通用编译规则,明确关联.c依赖
%.o : %.c
	gcc $(CFLAGS) -c $< $(IFLAGS) -o $(OPATH)$@

clean:
	rm -rf $(OPATH)* $(BPATH)*

修改点说明

  • 补全模式规则的依赖为%.c,make可以自动匹配vpath指定路径下的源文件触发编译
  • 新增目录自动创建逻辑,执行make时自动生成缺失的obj、bin目录,避免文件输出报错
  • 编译时直接指定输出路径到obj目录,无需额外执行mv操作,减少异常概率
  • 用addprefix函数统一给.o文件加路径前缀,避免重复书写路径降低拼写错误概率
  • 最终生成的main可执行文件直接输出到bin目录,无需额外执行mv操作

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 22:54:05