Makefile,更好理解规则

Makefile, better understanding rules

正在阅读 official documentation

A prerequisite is a file that is used as input to create the target. A target often depends on several files.

如果我的源文件已经包含 header,我应该在规则中列出 header 吗?

src.c

#include <stdio.h>
#include "myheader.h"

int main()
{
    printMessage();
    return 0;
}

myheader.h

void printMessage()
{
    printf("a message to screen\n");
}

生成文件

src : src.o
    cc -o src src.o

src.o : src.c
    cc -c src.c

如果我在先决条件中添加 myheader.h 它不会改变任何内容,相同的消息会打印到屏幕上。如果明确包含 header,它是否应该出现在先决条件中?

是的,你应该。

make 程序使用文件列表来确定依赖项是否已更改,结果是否应重建目标。它需要您明确指定该依赖项。

它看不到包含,它只看到你指定的规则。因此,理论上有可能您以需要 src.o 的 re-compilation 的方式更改 header,但 make 不会知道您这样做了,除非您告诉它小心。

头文件应该包含在依赖列表中。

第一次使用 make 构建程序时,无论是否包含 myheader.h 作为依赖项,它的编译效果都是一样的。不同之处在于其中一个文件发生更改时会发生什么。

如果您再次 运行 make 而不做任何更改,它会说 "src" 是最新的并且不会编译任何东西。但是,如果您要修改 myheader.h 没有 将其作为依赖项包含,那么 make 会说目标是最新的。它不会查看源文件来查看它包含哪些文件。 make 实用程序对 C 或 C++ 源代码(或任何其他源代码)一无所知。它 查看给定文件是否有更改,而不查看其内容。

当您将 myheader.h 作为依赖项包含时,如果您稍后修改该文件,则 运行ning make 将重建程序。

如果您想知道给定源文件所依赖的所有非系统头文件,您可以运行 gcc 加上-MM 选项。这将输出一个 make 规则,列出源文件的头依赖项。

例如,如果您 运行 gcc -MM src.c,您将得到以下输出:

src.o: src.c myheader.h

然后您可以将其包含在您的 makefile 中。