Makefile学习

最近要做一个nachos下面的实验需要学习一下Makefile的原理,把原来看过的复习一下

1. 编写Makefile文件 Make工具最主要也是最基本的功能就是通过makefile文件来描述源程序之间的相互关系并自动维护编译工作。而makefile 文件需要按照某种语法进行编写,文件中需要说明如何编译各个源文件并连接生成可执行文件,并要求定义源文件之间的依赖关系。 在 UNIX 系统中,习惯使用 Makefile 作为 makfile 文件。如果要使用其他文件作为makefile,则可利用类似下面的 make 命令选项指定 makefile 文件: make -f file1 例如,一个名为prog的程序由三个C源文件main.c、add.c和sub.c编译生成,后面两个文件还分别包含自己的头文件h_add.h和h_sub.h。通常情况下,C编译器将会输出三个目标文件main.o、add.o和sub.o。那么下面的文档就描述了这些文件之间的相互联系:

#It is a example for describing makefile

prog : main.o add.o sub.o

  gcc main.o add.o sub.o -o prog

main.o : main.c

  gcc -c main.c

add.o : add.c h_add.h

  gcc -c add.c

sub.o : sub.c h_sub.h

  gcc -c sub.c

---------------------------------------------------------- 这个描述文档就是一个简单的makefile文件。

从上面的例子注意到,第一个字符为 # 的行为注释行。第一个非注释行指定prog由三个目标文件main.o、add.o和sub.o链接生成。第三行描述了如何从prog所依赖的文件建立可执行文件。接下来的4、6、8行分别指定三个目标文件,以及它们所依赖的.c和.h文件。而5、7、9行则指定了如何从目标所依赖的文件建立目标。 注意:第3、5、7、9行的行首是一个Tab字符,这是区分命令行和其他行的依据。

当add.c或h_add.h文件在编译之后又被修改,则 make 工具可自动重新编译add.o,如果在前后两次编译之间,add.c 和h_add.h 均没有被修改,而且add.o还存在的话,就没有必要重新编译。这种依赖关系在多源文件的程序编译中尤其重要。通过这种依赖关系的定义,make 工具可避免许多不必要的编译工作。当然,利用 Shell 脚本也可以达到自动编译的效果,但是,Shell 脚本将全部编译任何源文件,包括哪些不必要重新编译的源文件,而 make 工具则可根据目标上一次编译的时间和目标所依赖的源文件的更新时间而自动判断应当编译哪个源文件。

posted @ 2014-03-25 18:10  hcs2024  阅读(122)  评论(0编辑  收藏  举报