先决条件是用作创建目标的输入的文件 . 目标通常取决于几个文件 .
如果我的源文件已经包含 Headers ,我应该在规则中列出 Headers 吗?
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
它什么都不改变,则会在屏幕上显示相同的消息 . 如果明确包含 Headers ,它是否应出现在先决条件中?
2 回答
是的你应该 .
make程序使用文件列表来确定依赖项是否已更改,并且应该重建目标 . 它需要您明确指定该依赖项 .
它没有看到包含,它只看到你指定的规则 . 因此理论上有可能以一种可能需要重新编译
src.o
的方式更改 Headers ,但make
不会知道你这样做,除非你告诉它要小心 .头文件应包含在依赖项列表中 .
第一次使用
make
构建程序时,无论是否包含myheader.h
,它都将编译相同的程序 . 不同之处在于其中一个文件发生变化时会发生什么 .如果你再次运行
make
而没有改变任何东西,它会说"src"是最新的,不会编译任何东西 . 但是,如果您要修改myheader.h
并且未将其作为依赖项包含,则make
将表示目标是最新的 . 它不会查看源文件以查看它包含的文件 .make
实用程序对C或C源代码(或任何其他源代码)一无所知 . 如果给定的文件在没有查看其内容的情况下进行更改,它看起来是 only .当您将
myheader.h
包含为依赖项时,如果稍后修改该文件,则运行make
将重建该程序 .如果要了解给定源文件所依赖的所有非系统头文件,可以使用
-MM
选项运行gcc . 这将输出一个make规则,列出源文件的头依赖项 .例如,如果您运行
gcc -MM src.c
,您将获得以下输出:然后,您可以在makefile中包含它 .