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
相关产品推荐
相关产品推荐

