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文件的时候 ,推荐写上目标文件的清除命令——一方面,不仅方便你重编译,另一方面,也利于保持文件的清洁。

  1. 未完待续.............................!

这篇文章是在参考别人的资料前提下进行总结的,由于本人能力有限,如有观点错误或者理解的不到位,请各位指正!

参考资料:

跟我一起写 Makefile(一).
跟我一起写 Makefile(二).
跟我一起写 Makefile(三).
跟我一起写 Makefile(四).
跟我一起写 Makefile(五).
跟我一起写 Makefile(六).
跟我一起写 Makefile(七).
跟我一起写 Makefile(八).
跟我一起写 Makefile(九).
跟我一起写 Makefile(十).
跟我一起写 Makefile(十一).
跟我一起写 Makefile(十二).
跟我一起写 Makefile(十三).
跟我一起写 Makefile(十四).

转载于:https://www.cnblogs.com/xzj8023tp/p/11193718.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值