MakeFile文件是什么——内容、工做原理、做用、使用

MakeFile文件是什么?它里面包含什么内容、具备什么做用、怎么使用?下面就来具体说说。程序员

     什么是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都成为了一种在工程方面的编译方法。express

1、什么是Makefile?编程

   makefile文件保存了编译器和链接器的参数选项,还表述了全部源文件之间的关系(源代码文件须要的特定的包含文件,可执行文件要求包含的目标文件模块及库等).建立程序(make程序)首先读取makefile文件,而后再激活编译器,汇编器,资源编译器和链接器以便产生最后的输出,最后输出并生成的一般是可执行文件.建立程序利用内置的推理规则来激活编译器,以便经过对特定CPP文件的编译来产生特定的OBJ文件. 
附上原文: 
Experienced  programmers  are  familiar  with  makefiles.  A  makefile  stores compiler  and  linker  options  and  expresses  all  the  interrelationships  among source  files.  (A  source  code  file  needs  specific  include  files,  an executable  file  requires  certain  object  modules  and  libraries,  and  so  forth.)  A  make  program  reads  the  makefile  and  then  invokes  the  compiler, assembler,  resource  compiler,  and  linker  to  produce  the  final  output,  which is  generally  an  executable  file.  The  make  program  uses  built-in  inference rules  that  tell  it,  for  example,  to  invoke  the  compiler  to  generate  an OBJ  file  from  a  specified  CPP  file.编辑器

2、Make是如何工做的?工具

在默认的方式下,也就是咱们只输入make命令。那么,ui

一、make会在当前目录下找名字叫“Makefile”或“makefile”的文件。操作系统

二、若是找到,它会找文件中的第一个目标文件(target),在上面的例子中,他会找到“edit”这个文件,并把这个文件做为最终的目标文件。code

三、若是edit文件不存在,或是edit所依赖的后面的 .o 文件的文件修改时间要比edit这个文件新,那么,他就会执行后面所定义的命令来生成edit这个文件。ip

四、若是edit所依赖的.o文件也不存在,那么make会在当前文件中找目标为.o文件的依赖性,若是找到则再根据那一个规则生成.o文件。(这有点像一个堆栈的过程)ci

五、固然,你的C文件和H文件是存在的啦,因而make会生成 .o 文件,而后再用 .o 文件生成make的终极任务,也就是执行文件edit了。

   这就是整个make的依赖性,make会一层又一层地去找文件的依赖关系,直到最终编译出第一个目标文件。在找寻的过程当中,若是出现错误,好比最后被依赖的文件找不到,那么make就会直接退出,并报错,而对于所定义的命令的错误,或是编译不成功,make根本不理。make只管文件的依赖性,即,若是在我找了依赖关系以后,冒号后面的文件仍是不在,那么对不起,我就不工做啦。

   经过上述分析,咱们知道,像clean这种,没有被第一个目标文件直接或间接关联,那么它后面所定义的命令将不会被自动执行,不过,咱们能够显示要make执行。即命令——“make clean”,以此来清除全部的目标文件,以便重编译。

   因而在咱们编程中,若是这个工程已被编译过了,当咱们修改了其中一个源文件,好比file.c,那么根据咱们的依赖性,咱们的目标file.o会被重编译(也就是在这个依性关系后面所定义的命令),因而file.o的文件也是最新的啦,因而file.o的文件修改时间要比edit要新,因此 edit也会被从新连接了(详见edit目标文件后定义的命令)。

   而若是咱们改变了“command.h”,那么,kdb.o、command.o和files.o都会被重编译,而且,edit会被重连接。

3、Makefile里有什么?

   Makefile里主要包含了五个东西:显式规则、隐晦规则、变量定义、文件指示和注释。

一、显式规则。显式规则说明了,如何生成一个或多的的目标文件。这是由Makefile的书写者明显指出,要生成的文件,文件的依赖文件,生成的命令。

二、隐晦规则。因为咱们的make有自动推导的功能,因此隐晦的规则可让咱们比较粗糙地简略地书写Makefile,这是由make所支持的。

三、变量的定义。在Makefile中咱们要定义一系列的变量,变量通常都是字符串,这个有点你C语言中的宏,当Makefile被执行时,其中的变量都会被扩展到相应的引用位置上。

四、文件指示。其包括了三个部分,一个是在一个Makefile中引用另外一个Makefile,就像C语言中的include同样;另外一个是指根 据某些状况指定Makefile中的有效部分,就像C语言中的预编译#if同样;还有就是定义一个多行的命令。有关这一部分的内容,我会在后续的部分中讲 述。

五、注释。Makefile中只有行注释,和UNIX的Shell脚本同样,其注释是用“#”字符,这个就像C/C++中的“//”同样。若是你要在你的Makefile中使用“#”字符,能够用反斜框进行转义,如:“\#”。

最后,还值得一提的是,在Makefile中的命令,必需要以[Tab]键开始。

相关文章
相关标签/搜索