我只是在学习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 是否会将文件视为中间文件并将其删除?
中间文件仅在默认情况下在隐式规则链中生成,并且仅在未明确提及时(作为目标或先决条件)生成。在您的情况下,您生成的所有文件都在 Makefile 中明确提及,因此它们不是中间文件。
您可以通过将文件列为先决条件来强制文件成为中间文件
.INTERMEDIATE
:一般来说,这将导致更多的工作,因为任何重建都
libmyhello.a
需要重建hello.o
,即使hello.c
没有改变。(顺便说一句,您应该将其hello.c
列为先决条件hello.o
。)有关详细信息,请参阅GNU Make 手册中有关链式隐式规则中的中间文件的部分。