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

配置Makefile输出编译产物到build目录时.o文件被自动删除是何原因

问题根源

你对GNU make「显式提及」的定义理解有误:模式规则中的通配符目标不属于显式提及的范畴。
文档中描述的「作为目标或前置条件被显式提及」,指的是完全展开后的具体文件名被直接写在Makefile的规则中,而$(OBJ_DIR)/%.o是模式匹配规则,通过该规则匹配生成的具体.o文件,没有被其他规则显式引用的情况下,仍然会被判定为中间文件自动删除。

解决方法

你可以任选以下一种方案解决:

  1. 使用.PRECIOUS特殊目标保留匹配模式的中间文件
    在Makefile中添加如下行即可:

    .PRECIOUS: $(OBJ_DIR)/%.o
    

    该配置会告诉make,所有匹配该模式的.o文件即使是中间文件,也不会被自动删除。

  2. 显式声明所有目标文件,让其被make识别为非中间文件
    先自动收集所有源文件并转换为对应的.o文件路径:

    SRCS = $(wildcard $(SRC_DIR)/*.c)
    OBJS = $(patsubst $(SRC_DIR)/%.c, $(OBJ_DIR)/%.o, $(SRCS))
    

    只要这些OBJS变量被任意规则作为前置引用(比如直接加到all目标的前置列表),对应的.o文件就会被判定为非中间文件,不会被删除。

  3. 全局禁用中间文件自动删除
    如果你不需要make自动清理任何中间文件,可以直接添加无参数的.SECONDARY特殊目标:

    .SECONDARY:
    

    该配置全局生效,所有生成的文件都不会被make自动删除。

内容的提问来源于stack exchange,提问作者gkaf

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 16:45:03