GNU Make通用规则生成可执行文件后自动删除目标文件的原因
GNU Make中.o文件是否自动删除的差异原因
核心逻辑:中间文件的判定规则
GNU Make会自动删除中间文件——这类文件是构建最终目标过程中临时生成的,既没有在Makefile里被显式声明为目标,也不是任何显式目标的依赖。反之,只要文件被显式关联到目标(作为依赖或自身是显式目标),就会被视为普通文件,构建后保留。
规则1:无指定目标的通用隐式规则
当你依赖Make的默认隐式规则(比如Makefile里未写具体目标规则,仅存在源文件),比如仅有test.c时运行make test,Make会自动触发两条隐式规则:
test: test.o(链接生成可执行)test.o: test.c(编译生成目标文件)
这里的test.o是Make为生成test自动创建的临时文件,既未被显式声明为目标,也不是任何显式目标的依赖,因此被判定为中间文件,构建完成后会被自动删除。
规则2:指定具体目标的模式规则
当你在Makefile里显式写出目标依赖和规则,比如:
CC = gcc test: test.o $(CC) -o $@ $^ test.o: test.c $(CC) -c -o $@ $<
此时test.o被显式列为test的依赖,同时自身也有对应的编译规则。这满足了「被显式关联到目标」的条件,Make会将其视为普通文件而非临时中间文件,因此构建后不会删除。
添加未被引用的目标规则时的情况
如果在Makefile里添加一条未被任何其他目标引用的规则,比如:
test.o: test.c
哪怕没有目标依赖test.o,test.o本身已是Makefile里显式声明的目标,Make会认为你需要保留这个文件,不会将其判定为中间文件,所以生成后不会被删除。
内容的提问来源于stack exchange,提问作者faruk yıldırım
相关产品推荐
相关产品推荐

