最稳妥的清理方式取决于构建方式:手动编译用rm -f *.o a.out;Makefile需加.PHONY: clean并定义clean: rm -f *.o a.out;启用ccache时必须执行ccache -C清缓存;多级目录用find . -name "*.o" -exec rm -f {} \;。

直接删最稳妥,但得看你在用什么构建方式——手动编译、Makefile 还是 ccache,清理命令完全不同。
手动编译后删 .o 和 a.out
如果你没写 Makefile,每次靠 gcc main.c -o app 这样敲命令,那编译产物就只有两类:目标文件(.o)和可执行文件(默认 a.out 或你指定的名)。清理就是直奔这两个:
- 删所有
.o:rm -f *.o - 删默认可执行文件:
rm -f a.out - 删你自定义的可执行文件,比如叫
myapp:rm -f myapp - 想一并清掉预处理文件(
.i)、汇编文件(.s):rm -f *.i *.s
注意:rm -f 会静默忽略不存在的文件,比不加 -f 更安全;但别手抖写成 rm -f *,容易误删源码。
Makefile 里加 clean 目标(必须加 .PHONY)
这是多人协作和中大型项目的标准做法。只写 clean: 不够,必须声明它是伪目标,否则当目录下真有个叫 clean 的文件时,make clean 就会跳过执行。
clean: rm -f *.o a.out myapp .PHONY: clean
关键点:
-
.PHONY: clean必须写在clean:规则之后或之前,但不能漏 - 命令行前必须是 Tab 键,不是空格(这是 Makefile 最常见的报错原因)
- 如果项目生成了多个可执行文件或放在
build/目录下,得同步改rm路径,比如:rm -f build/*.o build/myapp
用了 ccache 就别只删文件,得清缓存池
如果你启用了 ccache(比如 alias gcc='ccache gcc'),那中间编译结果其实存在独立缓存目录里,删 .o 文件完全不影响它。下次编译照样走缓存,可能用到旧逻辑。
- 清空全部缓存:
ccache -C - 查看缓存状态(确认是否启用、命中率):
ccache -s - 只清特定编译器缓存(如 gcc-12):
ccache -C --compiler=gcc-12
不执行 ccache -C,光跑 make clean,对缓存无感——这点特别容易被忽略。
用 find 按需递归清理多级目录
当项目开始分 src/、lib/、build/ 多目录,且你不想进每个子目录手动删,find 是最可控的方式:
- 删当前目录及子目录下所有
.o:find . -name "*.o" -exec rm -f {} \; - 删所有中间文件(
.o、.i、.s):find . \( -name "*.o" -o -name "*.i" -o -name "*.s" \) -exec rm -f {} \; - 慎用
-delete替代-exec rm:某些老系统不支持,-exec兼容性更好
注意路径开头的 . 表示从当前目录开始,别漏掉,否则可能清错地方。
真正麻烦的从来不是“怎么删”,而是删完发现某个 .h 文件改了但对应 .o 没重编——因为依赖没写全,或者 Makefile 里漏了头文件声明。这时候清理只是表象,根源在规则本身。


















