Makefile,更好地理解规则

时间:2018-10-03 12:23:31

标签: c linux makefile gnu-make

阅读official documentation

  

先决条件是一个文件,该文件用作创建目标的输入。一种   目标通常取决于几个文件。

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

src.c

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

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

myheader.h

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

makefile

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

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

如果我在前提条件中添加myheader.h却没有任何改变,则会在屏幕上显示相同的消息。如果显式包含标头,则该标头是否应出现在先决条件中?

2 个答案:

答案 0 :(得分:3)

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

第一次使用make来构建程序时,无论是否包含myheader.h作为依赖项,它的编译方式都相同。区别在于其中一个文件更改时会发生什么。

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

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

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

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

src.o: src.c myheader.h

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

答案 1 :(得分:2)

是的,你应该

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

它看不到包含,只看到您指定的规则。因此,从理论上讲,您可能以重新编译src.o的方式更改标头,但是make除非您告诉它要当心,否则不会知道您是否这样做。