为什么需要makefile文件和makefile文件的结构分析

本文是学习的总结,适用于初学者,有错误恳请指出

在Linux中,所有的源代码都需要编译成可执行文件才能最终执行,实现需要的功能。

写软件的时候,如果将所有的功能和代码都写在一个文件当中,则只需要对这个文件gcc即可生成想要的可执行文件。

但规模很大的软件显然无法全部写入一个文件,另外,多人协同的要求也使得将所有代码写入一个文件成为不可能,所以,在实际的软件工程中,会出现很多个文件,包括头文件、源代码、宏定义文件、……,而且每个文件需要include或引用其他的一些文件,这些都可以在设计阶段做好功能的分解以及任务的分工,那么,在各个人分得的任务都完成之后就需要将各人的代码组成一个完整的产品。

在最终的组合过程中,必然面临如下问题

1、哪些文件需要先编译

2、哪些文件需要后编译

3、对于每一个文件,在编译的过程中需要哪些辅助文件或者已经完成的编译文件(*.o文件)

更重要的是,在一个软件产品最终完成,和上线运行之前,上述过程将进行很多次,这时将要面临的其他问题是

4、文件A修改之后,导致哪些文件需要重新编译

  显然,我们不可能为了查看某一个文件的修改之后的效果而将所有整个工程的每个文件都重新编译

要解决上述问题的思路是,将整个产品的所有的每一个文件之间依赖关系表示清楚,然后按照彼此之间的关系决定编译顺序。

所谓依赖关系,比如,A代码中调用了代码文件B和C,此时则称A依赖B和C。

注意到,对于任何一个软件产品而言,其中涉及的所有文件之间的拓扑关系是一个树,而不是网络。

所以,我们只需要从树的根节点开始,每次描述一个文件的依赖关系,直至达到每个叶节点,即可完成对整个依赖关系的描述。

这一解决思路的表现形式即makefile的结构,如下:

上述makefile文件中,每两行一个单元,每个单元的结构都是“*:*1.o  *2.o *3.o ....”,然后第二行是对上一行中提到的的*1,*2,*3,……等文件的gcc编译命令
注意最后一行的clean,目的是清除所有的过程文件,所以没有依赖的文件

总之,搞清楚目的才是理解之本,也能自然的降低学习的难度。

Makefile的基本知识,如果需要学习,那么请参考: makefile 中文手册(点击打开链接

或者跟我一起写Makefile( 陈皓 )

猜你喜欢

转载自blog.csdn.net/cgch_cn/article/details/84984300