多子目录下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
相关产品推荐
相关产品推荐

