执行make时报错No such file 'main.o',该如何修复?
Makefile编译报错修复方案
错误根因
- 你为每个
.o目标显式定义的构建规则逻辑错误:-c参数后传入的是头文件而非.cpp源文件,编译头文件只会生成预编译头(后缀为.gch),不会生成对应名称的.o目标文件,导致链接阶段找不到所需的目标文件 - 显式定义了
.o的构建规则后,make不会再触发默认的%.o隐式编译规则,你预期的自动生成.o的逻辑不会执行 - main目标的链接命令中错误写入了不存在的
mccomp.o文件
修复后完整Makefile
# 可根据需求修改编译工具和参数 CXX = clang++ CFLAGS = -Wall -O2 all: main main: main.o lexer.o parser.o $(CXX) $(CFLAGS) -o $@ main.o lexer.o parser.o main.o: main.cpp lexer.h parser.h $(CXX) $(CFLAGS) -c main.cpp lexer.o: lexer.cpp lexer.h $(CXX) $(CFLAGS) -c lexer.cpp parser.o: parser.cpp parser.h lexer.h $(CXX) $(CFLAGS) -c parser.cpp clean: rm -rf main *.o
注意事项
- 每个目标下的命令行必须以Tab字符缩进,不能使用空格,否则会触发make语法错误
- 编译命令的
-c后只需传入对应.cpp源文件即可,头文件会根据源码中的include指令自动引入,无需手动传入编译命令 - clean规则新增了删除所有
.o文件的逻辑,执行make clean可清除所有编译产物,方便全量重新编译
内容的提问来源于stack exchange,提问作者Tom Finet
相关产品推荐
相关产品推荐

