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