You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.11 04:00:01