原文:https://blog.csdn.net/qq1452008/article/details/50855810
参考:https://www.cnblogs.com/cuckoos/articles/5049984.html 关于include的深入探索
1. 为什么要使用后缀名为 .d 的依赖文件?
在 Makefile 中, 目标文件的依赖关系需要包含一系列的头文件。
比如
main.c 源文件内容如下:
#include "stdio.h"
#include "defs.h"
int main(int argc, char *argv[])
{
printf("Hello, %s!\n", NAME);
return 0;
}
defs.h 头文件如下:
#ifndef _DEFS_H_
#define _DEFS_H_
#define NAME "makefile"
#endif _DEFS_H_
那么依赖关系如下(依赖的文件省略了绝对路径):
main.o : main.c stdio.h defs.h ...
假设目标文件的依赖关系缺少了 defs.h 文件,当 defs.h 文件中的内容改变后,根本不会重新编译目标文件,这是致命的,因为目标文件内部引用了 defs.h 文件中的宏定义。
如果是一个比较大型的工程,我们必需清楚每一个源文件都包含了哪些头文件,并且在加入或删除某些头文件时,也需要一并修改 Makefile,这是一个很没有维护性的工作。为了避免这种繁重而又容易出错的事情,可以使用 C/C++ 编译器的 “-M” 选项,即自动获取源文件中包含的头文件,并生成一个依赖关系。例如,执行下面的命令:
gcc -M main.c
其输出如下:
main.o : main.c defs.h
由编译器自动生成依赖关系,这样做的好处有以下几点:
- 不必手动书写若干目标文件的依赖关系,由编译器自动生成
- 不管是源文件还是头文件有更新,目标文件都会重新编译
2. 使用说明
参数介绍: