我只是在学习make。我偶然发现了关于 make 的自动删除中间文件的问题。我想更好地预测 make 如何标记文件中间(即回答“会自动删除它吗?”),所以我编写了一个像这样的虚拟项目来演示我的问题:
你好.h
#ifndef HELLO_H
#define HELLO_H
void hello(const char *name);
#endif
你好ç
#include <stdio.h>
void hello(const char *name) {
printf("Hello %s\n", name);
}
主程序
#include "hello.h"
int main() {
hello("world");
return 0;
}
生成文件
all: main
./main
clean:
rm -f *.o *.a
rm -f main
hello.o:
gcc -c hello.c
libmyhello.a: hello.o
ar -crv $@ hello.o
main: libmyhello.a
gcc -L. -o $@ [email protected] -lmyhello
.PHONY: all clean
当我制作时main
,它需要libmyhello.a
。libmyhello.a
需要hello.o
.如果我没理解错的话,hello.o
应该是一个中间文件。但它是没有删除正在进行中make main
。
为什么?如何判断 make 是否会将文件视为中间文件并将其删除?
答案1
中间文件仅在默认情况下在隐式规则链中生成,并且仅当它们是不是作为目标或先决条件明确提及。在您的情况下,您生成的所有文件都在 Makefile 中明确提及,因此它们不是中间文件。
您可以通过将文件列为先决条件来强制文件成为中间文件.INTERMEDIATE
:
.INTERMEDIATE: hello.o
一般来说,这将导致更多的工作,因为任何重建libmyhello.a
都需要重建hello.o
,即使hello.c
没有改变。 (顺便说一句,您应该将hello.c
其列为先决条件hello.o
。)
看链式隐式规则中有关中间文件的部分有关详细信息,请参阅 GNU Make 手册。