跟我一起写 Makefile
陈皓 (CSDN)
概述
——
什么是 makefile?或许很多 Winodws 的程序员都不知道这个东西,因为那些 Windows 的 IDE
都为你做了这个工作,但我觉得要作一个好的和 professional 的程序员,makefile 还是要懂。
这就好像现在有这么多的 HTML 的编辑器,但如果你想成为一个专业人士,你还是要了解
HTML 的标识的含义。特别在 Unix 下的软件编译,你就不能不自己写 makefile 了,会不会写
makefile,从一个侧面说明了一个人是否具备完成大型工程的能力。
因为,makefile 关系到了整个工程的编译规则。一个工程中的源文件不计数,其按类型、功
能、模块分别放在若干个目录中,makefile 定义了一系列的规则来指定,哪些文件需要先编
译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为
makefile 就像一个 Shell 脚本一样,其中也可以执行操作系统的命令。
makefile 带来的好处就是——“自动化编译”,一旦写好,只需要一个 make 命令,整个工程
完全自动编译,极大的提高了软件开发的效率。make 是一个命令工具,是一个解释 makefile
中指令的命令工具,一般来说,大多数的 IDE 都有这个命令,比如:Delphi 的 make,Visual
C++的 nmake,Linux 下 GNU 的 make。可见,makefile 都成为了一种在工程方面的编译方法。
现在讲述如何写 makefile 的文章比较少,这是我想写这篇文章的原因。当然,不同产商的
make 各不相同,也有不同的语法,但其本质都是在“文件依赖性”上做文章,这里,我仅
对 GNU 的 make 进行讲述,我的环境是 RedHat Linux 8.0,make 的版本是 3.80。必竟,这个
make 是应用最为广泛的,也是用得最多的。而且其还是最遵循于 IEEE 1003.2-1992 标准的
(POSIX.2)。
在这篇文档中,将以 C/C++的源码作为我们基础,所以必然涉及一些关于 C/C++的编译的知
识,相关于这方面的内容,还请各位查看相关的编译器的文档。这里所默认的编译器是 UNIX
下的 GCC 和 CC。
关于程序的编译和链接
——————————
在此,我想多说关于程序编译的一些规范和方法,一般来说,无论是 C、C++、还是 pas,首
先要把源文件编译成中间代码文件,在 Windows 下也就是 .obj 文件,UNIX 下是 .o 文件,
即 Object File,这个动作叫做编译(compile)。然后再把大量的 Object File 合成执行文件,
这个动作叫作链接(link)。