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

时间:2016-11-02 19:55:21

标签: c makefile gnu-make

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

1 个答案:

答案 0 :(得分:1)

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

假设您有以下内容:

b.h:

#ifndef B_H
#define B_H

struct s1 {
    int f1;
};

void f1(int p1);

#endif

A.H:

#ifndef A_H
#define A_H

#include "b.h"

void f2(struct s1 *p1);

#endif

交流转换器

#include "a.h"

void f3()
{
    struct s1 my_s1;
    my_s1.f1 = 1;
    my_s1.f2 = 2;
    f2(&my_s1);
}

假设b.h中struct s1的定义发生变化,删除字段f2。如果b.h不包含在a.c的依赖项列表中,则不会重新编译a.c.然后,您最终将现有目标文件与另一个具有struct s1的冲突定义的目标文件链接起来。然后,您最终得到undefined behavior

所以你需要弄清楚所有的依赖关系。幸运的是,gcc可以选择为您生成依赖关系规则:

gcc -MM a.c

这将输出适合make的规则,其中列出了所有非系统包含文件,包括直接和间接文件。

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