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

GNU Makefile隐式模式规则疑问:为何仅生成可执行文件未生成目标文件

为什么使用GNU Make模式规则编译时,目标文件init.o没有保留?

你遇到的这个问题本质是GNU Make对中间文件的默认处理逻辑导致的,咱们一步步拆解清楚:

两种Makefile的核心区别

在你最初的Makefile里,init.o是一个显式声明的目标——你专门写了init.o : init.cpp这条规则,Make会把它当成最终目标(init)的依赖项,属于需要保留的文件,所以编译完成后init.o会被留下来。

而改用模式规则后,%.o : %.cpp是通用的隐式规则,生成的init.o并没有被显式声明为独立目标,Make会把它认定为中间临时文件——这类文件是为了生成最终可执行文件而产生的过渡产物,Make默认会在编译完成后自动清理掉,所以你只看到了最终的init可执行文件。

解决办法:让Make保留init.o

有两种常用的方式可以让Make保留目标文件:

方法1:用.PRECIOUS特殊目标保护.o文件

.PRECIOUS目标可以指定哪些文件是Make不能自动删除的,把%.o加入进去就能保护所有通过模式规则生成的目标文件:

CXX=g++
.PRECIOUS: %.o
% : %.o
	$(CXX) -o $@ $<
%.o : %.cpp
	$(CXX) -c $<

方法2:显式声明init.o为目标

如果只需要保留init.o这一个文件,直接在Makefile里单独声明它即可,无需额外写依赖和命令,模式规则会自动匹配处理:

CXX=g++
init.o:  # 显式声明这个目标,避免被当成中间文件
% : %.o
	$(CXX) -o $@ $<
%.o : %.cpp
	$(CXX) -c $<

执行make init后,两种方法都能让init.o和init同时保留下来。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 11:37:37