C 我是否需要在make文件的依赖项列表中包含包含在其他头文件中的头文件?

C 我是否需要在make文件的依赖项列表中包含包含在其他头文件中的头文件?,c,makefile,gnu-make,C,Makefile,Gnu Make,例如,如果我有一个包含B.h.的A.h,并且我有一个用于A.h.的源文件A.c。那么在创建makefile时,我是否需要在每个sample.c(调用A.c中的函数)的依赖项列表中包含B.h?您应该在给定源文件的规则中包含所有直接和间接的非系统头 假设您有以下内容: b、 h: a、 h: a、 c 假设b.h中的struct s1的定义更改为删除字段f2。如果b.h未包含在a.c的依赖项列表中,则不会重新编译a.c。然后,将现有的对象文件与另一个对象文件链接,而struct s1的定义存在冲突。

例如,如果我有一个包含B.h.的A.h,并且我有一个用于A.h.的源文件A.c。那么在创建makefile时,我是否需要在每个sample.c(调用A.c中的函数)的依赖项列表中包含B.h?

您应该在给定源文件的规则中包含所有直接和间接的非系统头

假设您有以下内容:

b、 h:

a、 h:

a、 c

假设b.h中的
struct s1
的定义更改为删除字段
f2
。如果b.h未包含在a.c的依赖项列表中,则不会重新编译a.c。然后,将现有的对象文件与另一个对象文件链接,而
struct s1
的定义存在冲突。然后,你会得到一份工作

因此,您需要计算出所有依赖项。幸运的是,有一个选项可以为您生成依赖项规则:

gcc -MM a.c
这将输出适合make的规则,该规则列出了所有非系统包含文件,包括直接和间接文件

a.o: a.c a.h b.h

为什么不尝试不将它们作为依赖项,看看会发生什么。根据我的经验,最好的学习方法是通过尝试。最好的实践是包括所有的直接依赖关系。即使你知道他们中的一些人是相互包含的。自动生成这样的依赖关系。有一些示例makefile提供了这一点。如果你不必做,考虑一个现代化的构建工具,它具有内置的特性,例如SCons。
#include "a.h"

void f3()
{
    struct s1 my_s1;
    my_s1.f1 = 1;
    my_s1.f2 = 2;
    f2(&my_s1);
}
gcc -MM a.c
a.o: a.c a.h b.h