配置Makefile输出编译产物到build目录时.o文件被自动删除是何原因
问题根源
你对GNU make「显式提及」的定义理解有误:模式规则中的通配符目标不属于显式提及的范畴。
文档中描述的「作为目标或前置条件被显式提及」,指的是完全展开后的具体文件名被直接写在Makefile的规则中,而$(OBJ_DIR)/%.o是模式匹配规则,通过该规则匹配生成的具体.o文件,没有被其他规则显式引用的情况下,仍然会被判定为中间文件自动删除。
解决方法
你可以任选以下一种方案解决:
使用
.PRECIOUS特殊目标保留匹配模式的中间文件
在Makefile中添加如下行即可:.PRECIOUS: $(OBJ_DIR)/%.o该配置会告诉make,所有匹配该模式的
.o文件即使是中间文件,也不会被自动删除。显式声明所有目标文件,让其被make识别为非中间文件
先自动收集所有源文件并转换为对应的.o文件路径:SRCS = $(wildcard $(SRC_DIR)/*.c) OBJS = $(patsubst $(SRC_DIR)/%.c, $(OBJ_DIR)/%.o, $(SRCS))只要这些
OBJS变量被任意规则作为前置引用(比如直接加到all目标的前置列表),对应的.o文件就会被判定为非中间文件,不会被删除。全局禁用中间文件自动删除
如果你不需要make自动清理任何中间文件,可以直接添加无参数的.SECONDARY特殊目标:.SECONDARY:该配置全局生效,所有生成的文件都不会被make自动删除。
内容的提问来源于stack exchange,提问作者gkaf
相关产品推荐
相关产品推荐

