什么告诉 make 文件是中间文件(并且可以自动删除)?

什么告诉 make 文件是中间文件(并且可以自动删除)?

我只是在学习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.alibmyhello.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 手册。

相关内容