Linux环境下C++ Makefile编译报错求助:出现致命错误
修复你的Makefile编译错误
我帮你排查出了Makefile里的几个关键问题,这都是新手写Makefile时容易踩的坑,一个个来解决:
错误点说明
- 变量定义格式错误:你把
CXX和CXXFLAGS写在了同一行,Makefile要求每个变量单独占一行;另外-wall是拼写错误,正确的开启全警告选项是-Wall(大写W)。 - 编译选项混用:编译
main.o时你用了$(CFLAGS),但你定义的是C++编译选项$(CXXFLAGS),而且根本没声明CFLAGS,这里要换成$(CXXFLAGS)。 - 依赖项不完整:
Point.o必须依赖Point.cpp和Point.h,你漏掉了源文件Point.cpp;Rectangle.o同样要依赖Rectangle.cpp,只写头文件会导致源文件修改后不会重新编译。
- 清理命令有误:
rm *o应该改成rm *.o,少了点号会导致匹配错误,无法正确删除所有目标文件。 - 命令缩进问题:Makefile里目标下的命令必须用Tab键开头(不能用空格),否则会报“missing separator”的致命错误。
修正后的完整Makefile
CXX = g++ CXXFLAGS = -Wall -g all: main main: main.o Point.o Rectangle.o $(CXX) $(CXXFLAGS) -o main main.o Point.o Rectangle.o main.o: main.cpp Point.h Rectangle.h $(CXX) $(CXXFLAGS) -c main.cpp Point.o: Point.cpp Point.h $(CXX) $(CXXFLAGS) -c Point.cpp Rectangle.o: Rectangle.cpp Rectangle.h Point.h $(CXX) $(CXXFLAGS) -c Rectangle.cpp clean: rm -f *.o main
额外小提示
- 给
rm加-f参数,可以避免删除不存在的文件时抛出报错; - 如果后续项目文件增多,你可以尝试用
$@(代表目标)、$^(代表所有依赖)这类自动变量简化Makefile,不过先把基础格式搞对更重要。
内容的提问来源于stack exchange,提问作者Yash
相关产品推荐
相关产品推荐

