Makefile执行make all报错No such file or directory: out/test_speed.o求助
问题根因分析
- 最常见原因是Makefile规则的命令行缩进错误:Makefile要求所有规则下的执行命令必须用
Tab字符缩进,不能用空格。如果你的编辑器自动把Tab转换为了4/8个空格,make会识别不到生成out/test_speed.o的命令,因此不会执行.o文件的生成步骤,直接链接不存在的.o文件就会抛出对应报错。 - 第二个可能原因是
out目录实际不存在:大部分版本管理工具不会提交空目录,如果你是刚拉取的项目,空的out、bin目录不会被默认创建,编译时写入.o文件到不存在的目录也会失败。 - 第三个隐性问题:当前Makefile没有为.o文件添加头文件依赖,后续修改头文件时make不会自动触发重新编译,会导致生成的二进制文件和修改后的代码不匹配。
修复后的Makefile
CC = g++ CFLAGS = -Wall -g -std=c++11 INC = -I./include # 伪目标声明,避免和实际同名文件冲突 .PHONY: all test clean all: bin/test_speed test: bin/test_speed ./bin/test_speed bin/test_speed: out/test_speed.o | bin $(CC) $(CFLAGS) -o $@ $^ out/test_speed.o: tests/test_speed.cpp include/entry.hpp include/hashes.hpp include/linear_map.hpp include/robinhood_map.hpp | out $(CC) $(CFLAGS) $(INC) -c $< -o $@ # 自动创建不存在的目录 bin out: mkdir -p $@ clean: rm -rf out/* bin/*
修改点说明
- 新增了
| bin和| out的顺序依赖,编译前自动检查目录是否存在,不存在就先完成创建 - 给
.o目标补充了所有头文件依赖,修改头文件后会自动触发重新编译 - 用
$@、$^、$<等自动化变量简化写法,避免硬编码路径出错 - 增加了
.PHONY声明和clean规则,方便快速清理编译产物 - 把绝对路径的INC改成了相对路径
-I./include,项目移动位置后不需要修改Makefile配置
如果修改后仍然报错,可在编辑器里打开Makefile,把光标移到命令行开头按退格,若一次删除了4/8个空格,说明你用了空格缩进,替换为Tab字符即可正常运行。
内容的提问来源于stack exchange,提问作者Alex Peniz
相关产品推荐
相关产品推荐

