2019-01-30 21:36:53 -05:00

54 lines
4.2 KiB
ReStructuredText
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

概述
====
什么是makefile或许很多Windows的程序员都不知道这个东西因为那些Windows的集成开发环境
integrated development environmentIDE都为你做了这个工作但我觉得要作一个好的和专
业的程序员makefile还是要懂。这就好像现在有这么多的HTML编辑器但如果你想成为一个专业人士
你还是要了解HTML的标签的含义。特别在Unix下的软件编译你就不能不自己写makefile了会不会
写makefile从一个侧面说明了一个人是否具备完成大型工程的能力。
因为makefile关系到了整个工程的编译规则。一个工程中的源文件不计其数并且按类型、功能、模块分
别放在若干个目录中makefile定义了一系列的规则来指定哪些文件需要先编译哪些文件需要后编译
哪些文件需要重新编译甚至于进行更复杂的功能操作因为makefile就像一个Shell脚本一样其中也可
以执行操作系统的命令。
makefile带来的好处就是——“自动化编译”一旦写好只需要一个make命令整个工程完全自动编译
大的提高了软件开发的效率。 make是一个命令工具是一个解释makefile中指令的命令工具一般来说
大多数的IDE都有这个命令比如Delphi的makeVisual C++的nmakeLinux下GNU的make。可见
makefile都成为了一种在工程方面的编译方法。
现在讲述如何写makefile的文章比较少这是我想写这篇文章的原因。当然不同产商的make各不相同
也有不同的语法,但其本质都是在 “文件依赖性”上做文章这里我仅对GNU的make进行讲述我的环境
是RedHat Linux 8.0make的版本是3.80。毕竟这个make是应用最为广泛的也是用得最多的。而且
其还是最遵循于IEEE 1003.2-1992标准的POSIX.2)。
在这篇文档中将以C/C++的源码作为基础所以必然涉及一些关于C/C++的编译的知识。关于这方面的内
还请各位查看相关的编译器的文档。这里所默认的编译器是UNIX下的GCC和CC。
关于程序的编译和链接
--------------------
在此我想多说关于程序编译的一些规范和方法。一般来说无论是C还是C++,首先要把源文件编译成中间
代码文件在Windows下也就是 ``.obj`` 文件UNIX下是 ``.o`` 文件即Object File这个动
作叫做编译compile。然后再把大量的Object File合成执行文件这个动作叫作链接link
编译时,编译器需要的是语法的正确,函数与变量的声明的正确。对于后者,通常是你需要告诉编译器头文
件的所在位置头文件中应该只是声明而定义应该放在C/C++文件中),只要所有的语法正确,编译器就
可以编译出中间目标文件。一般来说,每个源文件都应该对应于一个中间目标文件( ``.o`` 文件或
``.obj`` 文件)。
链接时,主要是链接函数和全局变量。所以,我们可以使用这些中间目标文件( ``.o`` 文件或
``.obj`` 文件)来链接我们的应用程序。链接器并不管函数所在的源文件,只管函数的中间目标文件
Object File在大多数时候由于源文件太多编译生成的中间目标文件太多而在链接时需要明显
地指出中间目标文件名这对于编译很不方便。所以我们要给中间目标文件打个包在Windows下这种包
叫“库文件”Library File也就是 ``.lib`` 文件在UNIX下是Archive File也就是
``.a`` 文件。
总结一下,源文件首先会生成中间目标文件,再由中间目标文件生成执行文件。在编译时,编译器只检测程
序语法和函数、变量是否被声明。如果函数未被声明编译器会给出一个警告但可以生成Object File。
而在链接程序时链接器会在所有的Object File中找寻函数的实现如果找不到那到就会报链接错误码
Linker Error在VC下这种错误一般是 ``Link 2001错误`` ,意思说是说,链接器未能找到
函数的实现。你需要指定函数的Object File。
言归正传gnu的make有许多的内容闲言少叙。