首页 文章

Makefile,更好地理解规则

提问于
浏览
1

阅读official documentation

先决条件是用作创建目标的输入的文件 . 目标通常取决于几个文件 .

如果我的源文件已经包含 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 回答

  • 3

    是的你应该 .

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

    它没有看到包含,它只看到你指定的规则 . 因此理论上有可能以一种可能需要重新编译 src.o 的方式更改 Headers ,但 make 不会知道你这样做,除非你告诉它要小心 .

  • 2

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

    第一次使用 make 构建程序时,无论是否包含 myheader.h ,它都将编译相同的程序 . 不同之处在于其中一个文件发生变化时会发生什么 .

    如果你再次运行 make 而没有改变任何东西,它会说"src"是最新的,不会编译任何东西 . 但是,如果您要修改 myheader.h 并且未将其作为依赖项包含,则 make 将表示目标是最新的 . 它不会查看源文件以查看它包含的文件 . make 实用程序对C或C源代码(或任何其他源代码)一无所知 . 如果给定的文件在没有查看其内容的情况下进行更改,它看起来是 only .

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

    如果要了解给定源文件所依赖的所有非系统头文件,可以使用 -MM 选项运行gcc . 这将输出一个make规则,列出源文件的头依赖项 .

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

    src.o: src.c myheader.h
    

    然后,您可以在makefile中包含它 .

相关问题