一.make是如何工作的
在默认的方式下,也就是只输入make命令。那么,
(1)make会在当前目录下找名字叫“Makefile”或“makefile”的文件。
默认的情况下,make命令会在当前目录下按顺序找寻文件名为“GNUmakefile”、“makefile”、“Makefile”的文件,找到了解释这个文件。在这三个文件名中,最好使用“Makefile”这个文件名,因为这个文件名第一个字符为大写,这样有一种显目的感觉。最好不要用“GNUmakefile”,这个文件是GNU的make识别的。有另外一些make只对全小写的“makefile”文件名敏感,但是基本上来说,大多数的make都支持“makefile”和“Makefile”这两种默认文件名。当然,可以使用别的文件名来书写Makefile,比如:“Make.Linux”,“Make.Solaris”,“Make.AIX”等,如果要指定特定的Makefile,可以使用make的“-f”和“--file”参数,如:make -f Make.Linux或make --file Make.AIX。
(2)如果找到,它会找文件中的第一个目标文件(target),并把这个文件作为最终的目标文件。
(3)如果第一个目标文件文件不存在,或是第一个目标文件所依赖的后面的 .o 文件的文件修改时间要比第一个目标文件新,那么,他就会执行后面所定义的命令来生成这个文件。
(4)如果第一个目标文件所依赖的.o文件也不存在,那么make会在当前文件中找目标为.o文件的依赖性,如果找到则再根据那一个规则生成.o文件。(这有点像一个堆栈的过程)
(5)当然,C文件和H文件是存在的,于是make会生成 .o 文件,然后再用 .o 文件生命make的终极任务,也就是执行第一个目标文件了。
这就是整个make的依赖性,make会一层又一层地去找文件的依赖关系,直到最终编译出第一个目标文件。在找寻的过程中,如果出现错误,比如最后被依赖的文件找不到,那么make就会直接退出,并报错,而对于所定义的命令的错误,或是编译不成功,make根本不理。make只管文件的依赖性,即,如果在找了依赖关系之后,冒号后面的文件还是不在,那么就不工作了。
命令——“make clean”,以此来清除所有的目标文件,以便重编译。
二.什么是makefile文件
在 Linux(unix )环境下使用GNU 的make工具能够比较容易的构建一个属于你自己的工程,整个工程的编译只需要一个命令就可以完成编译、连接以至于最后的执行。不过这需要我们投入一些时间去完成一个或者多个称之为Makefile 文件的编写。
make是一个命令工具,它解释Makefile 中的指令(应该说是规则)。在Makefile文件中描述了整个工程所有文件的编译顺序、编译规则。Makefile 有自己的书写格式、关键字、函数。像C 语言有自己的格式、关键字和函数一样。而且在Makefile 中可以使用系统shell所提供的任何命令来完成想要的工作。Makefile(在其它的系统上可能是另外的文件名)在绝大多数的IDE 开发环境中都在使用,已经成为一种工程的编译方法。
三.makefile文件的作用
makefile关系到了整个工程的编译规则。一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为makefile就像一个Shell脚本一样,其中也可以执行操作系统的命令。
makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。
四.makefile文件的编写
示例工程有8个C文件,和3个头文件,我们要写一个Makefile来告诉make命令如何编译和链接这几个文件。我们的规则是:
1)如果这个工程没有编译过,那么我们的所有C文件都要编译并被链接。
2)如果这个工程的某几个C文件被修改,那么我们只编译被修改的C文件,并链接目标程序。
3)如果这个工程的头文件被改变了,那么我们需要编译引用了这几个头文件的C文件,并链接目标程序。
写好Makefile文件后,然后在该目录下直接输入命令“make”就可以生成执行文件——第一个目标文件(target)。如果要删除执行文件和所有的中间目标文件,那么,只要简单地执行一下“make clean”就可以了。
1 MakeFile里有什么
Makefile里主要包含了五个东西:显式规则、隐晦规则、变量定义、文件指示和注释。
(1)显式规则。显式规则说明了,如何生成一个或多的的目标文件。这是由Makefile的书写者明显指出,要生成的文件,文件的依赖文件,生成的命令。
(2)隐晦规则。由于make有自动推导的功能,所以隐晦的规则可以让我们比较粗糙地简略地书写Makefile,这是由make所支持的。
(3)变量的定义。在Makefile中要定义一系列的变量,变量一般都是字符串,这个有点像C语言中的宏,当Makefile被执行时,其中的变量都会被扩展到相应的引用位置上。
(4)文件指示。其包括了三个部分,一个是在一个Makefile中引用另一个Makefile,就像C语言中的include一样;另一个是指根据某些情况指定Makefile中的有效部分,就像C语言中的预编译#if一样;还有就是定义一个多行的命令。
(5)注释。Makefile中有行注释,和UNIX的Shell脚本一样,其注释是用“#”字符,这个就像C/C++中的“//”一样。如果要在Makefile中使用“#”字符,可以用反斜框进行转义,如:“/#”。
最后值得一提的是,在Makefile中的命令,必须要以[Tab]键开始。
2 MakeFile语法(规则):
target :prerequisites
command
目标:依赖
执行指令 ...
target:是一个目标文件,可以是Object File,也可以是执行文件。还可以是一个标签(Label)。文件名以空格分开,可以使用通配符。一般来说,目标基本上是一个文件,但也有可能是多个文件。
prerequisites:要生成那个target所需要的文件或是目标。
command:是make需要执行的命令。(任意的Shell命令)。在定义好依赖关系后,后续的那一行定义了如何生成目标文件的操作系统命令。command是命令行,如果其不与“target:rerequisites”在一行,那么,必须以[Tab键]开头,如果和prerequisites在一行,那么可以用分号(;)做为分隔。如果命令太长,可以使用反斜框(‘/’)作为换行符。make对一行有多少个字符没有限制。规则告诉make两件事,文件的依赖关系和如何成成目标文件。
上述形