Linux中基于g++的makefile文件的总结与注意的地方
makefile的作用就是定义一系列的依赖规则,在执行make命令的时候,依据这个规则执行就可以了!
makefile关系到了整个工程的编译规则。一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为makefile就像一个Shell脚本一样,其中也可以执行操作系统的命令。
相较于编译器的优点与缺点:
1,编译速度上:通过makefile文件进行编译,在第一次编译成功之后,以后由于项目中文件的增上改,makefile会选择性的进行编译,而不是全部工程都编译一次,在大型项目上速度非常有优势,而用编辑器来自动编译的时候,每次修改都会全部编译一次,当项目比较大的时候就非常慢了。
2.方便性:makefile的缺点就是需要人为的去写这个文件,而编辑器(Windows的IDE,例如:Visual Studio)自动帮你编译,不需要你人为的写。
在学生时代,由于没有接触大型的项目,只是编程学习而已,所以对编辑器比较依赖,也就对makefile了解的较少,当你走上岗位后,makefile是必须要学习的,作为一个professional的程序员,需要对自己有点高要求,如果你没有接触,或者不懂makefile的话,也说明你没有参加过大的项目开发。makefile会与否,从一定的方面上说明了这个人是否具备完成大型工程的能力。
Makefile的规则:
target ... : prerequisites ...
command
...
...
target也就是一个目标文件,可以是Object File,也可以是执行文件。
prerequisites就是,要生成那个target所需要的文件或是目标。
command也就是make需要执行的命令。(任意的Shell命令)
这是一个文件的依赖关系,也就是说,target这一个或多个的目标文件依赖于prerequisites中的文件,其生成规则定义在command中。说白一点就是说,prerequisites中如果有一个以上的文件比target文件要新的话,command所定义的命令就会被执行。这就是Makefile的规则。也就是Makefile中最核心的内容。
makefile的编译规则:
make会比较targets文件和prerequisites文件的修改日期,如果prerequisites文件的日期要比targets文件的日期要新,或者target不存在的话,那么,make就会执行后续定义的命令。
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]键开始。
写makefile需要注意的地方:
1.在定义好依赖关系后,后续的那一行定义了如何生成目标文件的操作系统命令,就是写command时,一定要以一个Tab键作为开头,一定要以一个Tab键作为开头,一定要以一个Tab键作为开头,重要的事说三遍,不然会出错的。
2.如果你写的是c语言,就用cc命令,如果你写的是C++,就用g++的命令,cc命令不会自动链接,如果你用cc为c++文件写命令,会出现链接失败的提示。
3.当makefile比较复杂,共同的依赖文件比较多的时候,使用变量会非常方便,有点类似开发中的配置文件的作用。
4.当makefile比较复杂,可以用make中潜规则(默认规则)——make自动推导;来结合makefile中的变量使用。
5.写makefile文件的时候 ,推荐写上目标文件的清除命令——一方面,不仅方便你重编译,另一方面,也利于保持文件的清洁。
6.
未完待续.............................!
这篇文章是在参考别人的资料前提下进行总结的,由于本人能力有限,如有观点错误或者理解的不到位,请各位指正!
参考资料:
跟我一起写 Makefile(一).
跟我一起写 Makefile(二).
跟我一起写 Makefile(三).
跟我一起写 Makefile(四).
跟我一起写 Makefile(五).
跟我一起写 Makefile(六).
跟我一起写 Makefile(七).
跟我一起写 Makefile(八).
跟我一起写 Makefile(九).
跟我一起写 Makefile(十).
跟我一起写 Makefile(十一).
跟我一起写 Makefile(十二).
跟我一起写 Makefile(十三).
跟我一起写 Makefile(十四).