Makefile澄清:包含标题的文件,其中包含另一个标题

时间:2016-11-01 01:25:03

标签: c gcc makefile

当我的程序包含包含另一个标题的标题时会发生什么? 比方说,例如,main.c包含header1.h,header1.h包括header2.h。我的makefile应该是:

main.x: main.o
    gcc -o main.x

main.o: main.c header1.h header2.h
    gcc -c main.c

OR是否不必包含header2.h?

main.x: main.o
    gcc -o main.x

main.o: main.c header1.h
    gcc -c main.c

或者根本不需要包含任何标题?

main.x: main.o
    gcc -o main.x

main.o: main.c
    gcc -c main.c

2 个答案:

答案 0 :(得分:0)

在Makefile中列出依赖项的目的是让make知道在什么情况下需要重建。如果自生成目标以来已修改列为依赖项的文件,则需要重建目标。因此,列出所有在构建目标时粗略查阅的文件是个好主意。

如果您没有列出包含小时的文件,那么一切都将继续有效 - 直到您编辑未告诉make的文件为止,此时您会发现{{1}可能不会费心去重新编译。

答案 1 :(得分:0)

您必须将每个包含文件命名为依赖项,因为(按设计)make并不知道C的工作原理。 gcc和GNU make为此提供了解决方案:

main.x: main.o
    gcc -o main.x

main.o main.d: main.c
    gcc -MD -MF -MG -MP main.d -c main.c

-include main.d

include前面的短划线导致make忽略丢失的.d个文件,-MD ...导致gcc生成包含依赖关系规则的文件,以便在{ {1}}(make导致生成作为编译的副作用,-MD命名文件以将其写入,-MF导致创建假定的规则,缺少头文件将创建并-MG为头文件创建虚假目标,因此删除头文件并不会因为缺少依赖性而阻止进一步构建。