Makefile编译C++项目未生成.o文件且报错问题求助
问题排查
你的Makefile存在6处明确错误,是导致目标文件生成失败、编译报错的直接原因:
- 变量定义语法错误:第三行
STD=-std=c++11 -Wall -pedanticCF=$(STD)漏了换行,CF编译参数变量未被正确定义,-pedantic后直接拼接了变量定义语句,会被编译器识别为非法选项。 - 目标规则语法错误:
(BUILD_DIR)/response.o漏了变量引用符号$,正确写法为$(BUILD_DIR)/response.o,make无法识别该目标,不会触发response.cpp的编译。 - 编译输出路径错误:
Driver.o规则的输出文件错写为根目录下的template_parser.o,但最终链接阶段依赖的是$(BUILD_DIR)/template_parser.o,路径完全不匹配,且原规则未编写template_parser.cpp对应的编译逻辑,错误用Driver.cpp的编译产物顶替。 - 缺失目录创建规则:定义了
BUILD_DIR=build作为部分.o文件的输出目录,但没有编写目录不存在时自动创建的规则,首次编译时会因输出路径不存在报错。 - 链接依赖不全:生成
myserver.out的依赖列表漏写了Server_t.o、User.o、Trip.o、Passenger.o、Location.o、Driver.o,make不会自动编译未列入依赖的目标文件,链接时会直接报文件不存在。 - clean命令逻辑错误:原
rm -r *.o *.out仅能删除根目录下的编译产物,无法清理build目录下的.o文件,且递归删除参数-r用于普通文件无意义,遇到文件不存在时会抛出错误。
修复后完整Makefile
CC=g++ STD=-std=c++11 -Wall -pedantic CF=$(STD) BUILD_DIR=build all: $(BUILD_DIR) myserver.out # 编译前自动创建build目录 $(BUILD_DIR): mkdir -p $(BUILD_DIR) $(BUILD_DIR)/response.o: utils/response.cpp utils/response.hpp utils/include.hpp $(CC) $(CF) -c utils/response.cpp -o $(BUILD_DIR)/response.o $(BUILD_DIR)/request.o: utils/request.cpp utils/request.hpp utils/include.hpp utils/utilities.hpp $(CC) $(CF) -c utils/request.cpp -o $(BUILD_DIR)/request.o $(BUILD_DIR)/utilities.o: utils/utilities.cpp utils/utilities.hpp $(CC) $(CF) -c utils/utilities.cpp -o $(BUILD_DIR)/utilities.o $(BUILD_DIR)/server.o: server/server.cpp server/server.hpp server/route.hpp utils/utilities.hpp utils/response.hpp utils/request.hpp utils/include.hpp utils/template_parser.hpp $(CC) $(CF) -c server/server.cpp -o $(BUILD_DIR)/server.o $(BUILD_DIR)/route.o: server/route.cpp server/route.hpp utils/utilities.hpp utils/response.hpp utils/request.hpp utils/include.hpp $(CC) $(CF) -c server/route.cpp -o $(BUILD_DIR)/route.o # 补全template_parser.o的编译规则,输出到build目录 $(BUILD_DIR)/template_parser.o: utils/template_parser.cpp utils/template_parser.hpp $(CC) $(CF) -c utils/template_parser.cpp -o $(BUILD_DIR)/template_parser.o Driver.o: Driver.cpp Driver.h User.h Passenger.h $(CC) $(CF) -c Driver.cpp -o Driver.o handlers.o: handlers.cpp handlers.hpp User.h Passenger.h Driver.h server/server.hpp Location.h $(CC) $(CF) -c handlers.cpp -o handlers.o Location.o: Location.cpp Location.h $(CC) $(CF) -c Location.cpp -o Location.o Passenger.o: Passenger.cpp Passenger.h User.h Trip.h $(CC) $(CF) -c Passenger.cpp -o Passenger.o Trip.o: Trip.cpp Trip.h Passenger.h Location.h $(CC) $(CF) -c Trip.cpp -o Trip.o User.o: User.cpp User.h $(CC) $(CF) -c User.cpp -o User.o Server_t.o: Server_t.cpp Server_t.hpp User.h Passenger.h Driver.h server/server.hpp Location.h utils/request.hpp utils/response.hpp $(CC) $(CF) -c Server_t.cpp -o Server_t.o MyServer.o: MyServer.cpp MyServer.hpp server/server.hpp $(CC) $(CF) -c MyServer.cpp -o MyServer.o main.o: main.cpp Server_t.h Location.h handlers.hpp MyServer.hpp $(CC) $(CF) -c main.cpp -o main.o # 补全所有链接依赖的目标文件 myserver.out: MyServer.o main.o handlers.o Server_t.o User.o Trip.o Passenger.o Location.o Driver.o $(BUILD_DIR)/response.o $(BUILD_DIR)/request.o $(BUILD_DIR)/utilities.o $(BUILD_DIR)/server.o $(BUILD_DIR)/route.o $(BUILD_DIR)/template_parser.o $(CC) $(CF) Server_t.o User.o Trip.o Passenger.o Location.o Driver.o MyServer.o main.o handlers.o $(BUILD_DIR)/response.o $(BUILD_DIR)/request.o $(BUILD_DIR)/utilities.o $(BUILD_DIR)/server.o $(BUILD_DIR)/route.o $(BUILD_DIR)/template_parser.o -o myserver.out .PHONY: clean clean: rm -f *.o *.out rm -rf $(BUILD_DIR)
使用说明
替换原有Makefile后,先执行make clean清理历史残留的错误编译产物,再执行make即可正常完成编译,生成可执行文件myserver.out。
内容的提问来源于stack exchange,提问作者sobhan alaeddini
相关产品推荐
相关产品推荐

