运行Makefile时报错make: *** [makefile:8: run] Error 127如何解决?
Makefile Error 127 报错原因与修复
报错原因
make: *** [makefile:8: run] Error 127 本质是执行run目标下的./main命令时,系统找不到对应的可执行文件,返回了127状态码。
触发这个问题的根源是你编写的Makefile存在逻辑缺陷:
main目标的依赖声明为*.o,但生成命令却直接用g++ -o main *.cpp编译所有源码,完全跳过了.o生成环节。如果你的代码存在语法错误、头文件缺失等问题,编译会直接失败,不会生成main可执行文件,后续执行run目标自然找不到文件。run目标没有声明依赖,执行make run时不会自动检查main是否存在、是否需要重新编译,哪怕main不存在也会直接执行./main触发报错。
修复方案
你可以直接使用如下修正后的Makefile:
# 编译器与编译参数定义 CXX = g++ CXXFLAGS = -g # 自动识别目录下所有cpp源码、生成对应的目标文件列表 SRCS = $(wildcard *.cpp) OBJS = $(patsubst %.cpp, %.o, $(SRCS)) TARGET = main # 默认编译目标 all: $(TARGET) # 链接目标文件生成可执行文件 $(TARGET): $(OBJS) $(CXX) $(CXXFLAGS) -o $@ $^ # 单个cpp文件编译规则 %.o: %.cpp *.h $(CXX) $(CXXFLAGS) -c $< -o $@ # 运行前先检查可执行文件是否最新,未编译则先编译 run: $(TARGET) ./$(TARGET) # 清理规则加-f参数,避免删除不存在的文件时报错 clean: rm -f *.o $(TARGET)
修正说明
- 给
run目标添加了$(TARGET)依赖,每次执行make run都会自动检查可执行文件状态,不存在或者源码有更新时会先编译再运行,从根源上避免找不到可执行文件的问题。 - 修正了
main的生成逻辑,符合Makefile增量编译的设计,修改单个文件后不需要重新编译所有源码。 - 用内置函数自动处理文件列表,比直接写通配符作为依赖更稳定,不会出现新增/删除文件后依赖识别错误的问题。
- 给
rm添加-f参数,清理不存在的文件时不会抛出无关报错。
如果替换后仍有报错,可先执行make main查看编译环节的具体输出,通常是你的业务代码本身存在语法错误、头文件引用错误导致编译失败,修复代码问题后即可正常运行。
内容的提问来源于stack exchange,提问作者Andreas
相关产品推荐
相关产品推荐

