使用make命令编译main.cpp报g++无输入文件错误该如何解决?
执行make时的报错信息:
g++: error: main: No such file or directory g++: fatal error: no input files compilation terminated. make: *** [Makefile:2: main] Error 1原错误Makefile内容:
main: main.cpp g++ main -o main.cpp main.o: g++ -c main.cpp PHONY: clean clean: rm * .o main.cpp
报错成因
- 编译命令参数顺序完全颠倒:
g++的标准语法为g++ [源文件路径] -o [输出文件路径],你编写的g++ main -o main.cpp会将不存在的main作为输入源文件,试图输出覆盖main.cpp,自然找不到输入文件触发报错。 - Makefile语法不符合规范:所有目标对应的执行命令前必须添加Tab缩进(不能用空格替代),你编写的所有g++、rm命令前都没有加缩进,make无法识别为对应目标的执行指令。
- 伪目标声明错误:伪目标的标准声明格式为
.PHONY: clean,你遗漏了开头的.,如果当前目录存在名为clean的文件,make会直接跳过clean指令的执行。 - clean指令逻辑严重错误:你编写的
rm * .o main.cpp中*通配符会匹配当前目录所有文件,直接清空当前目录的同时还会删除源码文件main.cpp,完全不符合清理编译产物的需求。 main.o规则缺失依赖:main.o的生成依赖main.cpp,你没有在规则中声明依赖,修改源码后不会自动重新编译main.o。
修正后的完整Makefile
# 主目标:生成可执行文件main main: main.cpp g++ main.cpp -o main # 生成目标文件规则(多文件编译场景使用,单文件场景可直接省略) main.o: main.cpp g++ -c main.cpp # 声明clean为伪目标 .PHONY: clean clean: rm -f *.o main
修正说明
- 调整了编译命令的参数顺序,将源文件
main.cpp放在前,输出的可执行文件main放在-o参数后。 - 所有执行命令前添加了标准Tab缩进。
- 修正了
.PHONY伪目标的声明格式。 - 调整clean指令逻辑,仅删除编译生成的
.o目标文件和main可执行文件,添加-f参数避免删除不存在的文件时报错。 - 补充了
main.o规则的依赖声明,修改源码后可自动触发重新编译。
内容的提问来源于stack exchange,提问作者imwitit35
相关产品推荐
相关产品推荐

