先决条件是一个文件,该文件用作创建目标的输入。一种 目标通常取决于几个文件。
如果我的源文件已经包含标题,我应该在规则中列出标题吗?
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
却没有任何改变,则会在屏幕上显示相同的消息。如果显式包含标头,则该标头是否应出现在先决条件中?
答案 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
除非您告诉它要当心,否则不会知道您是否这样做。>