本文主要参考 Makefile自动生成头文件依赖 和GNU make 中文手册(这个文档网上挺多,可自行百度)。
网上关于makefile的资料很多,甚至我买的linux编程书上都对它有些简单的介绍,不过很多资料都不是很详细。这里我推荐“GNU makefile中文手册“,很适合作为小白学习makefile的入门书籍,不过可能有些过于详细,可以跳着看。
一般而言,实用的makefile文件应当能够实现 自动生产头文件依赖 功能。而自动产生头文件功能的实现则依赖于编译器提供的自动产生依赖关系的功能。对于GCC而言,编译时实用 ”-M“ 选项,其将输出源文件中包含的包括标准库头文件在内的依赖关系,而 ”-MM“ 选项的输出则不会包含标准库头文件。
如对于程序
#include<stdio.h>
#include "./a.h"
extern void function_two();
extern void function_three();
int main()
{
function_two();
function_three();
return 0;
}
对于gcc,如果实用 -M 选项,输出为
main.o: main.c /usr/include/stdc-predef.h /usr/include/stdio.h \
/usr/include/features.h /usr/include/x86_64-linux-gnu/sys/cdefs.h \
/usr/include/x86_64-linux-gnu/bits/wordsize.h \
/usr/include/x86_64-linux-gnu/gnu/stubs.h \
/usr/include/x86_64-linux-gnu/gnu/stubs-64.h \
/usr/lib/gcc/x86_64-linux-gnu/5/include/stddef.h \
/usr/include/x86_64-linux-gnu/bits/types.h \
/usr/include/x86_64-linux-gnu/bits/typesizes.h /usr/include/libio.h \
/usr/include/_G_config.h /usr/include/wchar.h \
/usr/lib/gcc/x86_64-linux-gnu/5/include/stdarg.h \
/usr/include/x86_64-linux-gnu/bits/stdio_lim.h \
/usr/include/x86_64-linux-gnu/bits/sys_errlist.h a.h
如果使用 -MM 选项,输出为
main.o: main.c a.h
具体区别非常清楚了。
可以看出使用 -MM 选项的GCC的输出和我们在makefile中写的依赖关系基本相同。那么makefile