Linux项目自动化构建工具make与makefile

目录

 背景

一.什么是make和makefile

二. 为什么存在make和makefile

三.怎么使用make和makefile

2.1 依赖关系

2.2 依赖方法

2.3  伪目标

2.4 问题

2.5 make原理

2.6 makefile文件的其它写法

2.7 生成多个可执行文件

2.8 makefile五大特征



 背景

  • 会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力
  • 一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作
  • makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。
  • make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,makefile都成为了一种在工程方面的编译方法。
  • make是一条命令,makefile是一个文件,两个搭配使用,完成项目自动化构建

从三个角度分析make和makefile,

可以这样说,make和makefile主要应用于linux多文件编程的管理。

一.什么是make和makefile

        make是一个执行依赖关系和依赖方法的命令。注意是一条命令

        makefile是一个自己创建的文件,里面保存的是各种依赖关系和依赖方法。通常在项目目录下存放。

        makefile里默认只生成一个可执行文件。

二. 为什么存在make和makefile

        我们知道一个项目可能由很多源文件和头文件组成。一个可执行程序的生成,需要通过预处理,编译,汇编和链接来完成。如果一个源文件生成目标文件需要一个一个生成,这样效率会很低。

        在linux下,有了makefile,我们就不需要将每一个源文件都要gcc来生成目标文件,在链接成可执行文件,或者直接gcc后面加上所有的源文件名,如果源文件由很多导致效率很低下。有了makefile,在makefile里确认好依赖关系和依赖方法,只需要通过一个make指令就可以完成上面的操作。

        在windows下,上面的工作由编译器帮我们实现了。在liunx中,我们需要make和makefile来帮我们实现,维护好项目文件的关系。

三.怎么使用make和makefile

如何编写makefile文件:

输入 vim makefile指令编写makefile文件内容

 编写好makefile文件后,直接在允许命令make就可以生成相应可执行文件和目标文件。依赖关系里的。

清理文件:

2.1 依赖关系

        依赖关系,代表了两个文件之间的一种隐性的关系,这决定了我们能不能这样做。

比如,一个可执行文件和目标文件之间,就存在着一种依赖关系。可执行文件由目标文件形成。

 例如上面的:

        2.2 依赖方法

        依赖方法:是实现依赖关系,决定了如何做。

例如上面的:gcc main.o hello.o -o hello 是通过编译器gcc来生成hello可执行程序的。

        2.3  伪目标

伪目标由关键字.PHONY修饰,作用是表明目标可以一直被执行,并且为目标后面不要跟关系

 什么是可以总是被执行?什么是不可以总是被执行?

但是当我执行.PHONY修饰的伪目标clean时。

 .PHONY也可以修饰要生成的可执行程序,作用也是可以一直被执行。

 但是这样可能会导致效率低下,如果文件很多,生成一个目标文件时间很长,如果一直可以生成可执行文件,误操作生成后,浪费时间。

2.4 问题

        为什么头文件.h文件不需要加到makefile里?

        头文件编译器会自己管理,不需要我们管理。

        上面我们make时当我们make生成了最新的可执行程序后,再make,会提示我们已经生成过该文件了,但是当我们改动源文件,就又可以make生成可执行文件。

        注意:只会编译改动的文件,没改动的不会再编译

        编译文件时,编译器是怎么知道生成的可执行文件是否可以重新编译呢?

        编译器是通过文件属性里的修改时间来确定的。我们知道当没有改动源文件是,可执行程序时间肯定在源文件后生成,当修改源文件后,修改时间在可执行程序时间后。

2.5 make原理

  1. make指令执行时会找到当前目录下的makefile或Makefile文件。
  2. 找到makefile文件中的第一个目标文件,作为最总生成的文件。上面例子中是hello文件。
  3. 如果不存在hello文件,会找到这个依赖关系冒号:后的文件,上面是hello.o和main.o。向下找到生成hello.o main.o这层的依赖关系。
  4. 直到找到依赖关系冒号后面存在的文件并可以生成冒号前面的目标文件的依赖关系。
  5. 然后一层一层生成,直到最后生成最终的目标文件。
  6. 如果在寻找的过程中出现错误,比如最后找不到依赖的文件,make会直接退出,并报错。

2.6 makefile文件的其它写法

        特殊符号:在依赖方法前加@,可以在make指令后不显示内容

         定义变量加特殊符号

 文件生成可执行文件通过预处理(-E),编译(-S),汇编(-c) ,链接生成

预处理不用文件接收会将生成的.i文件显示在屏幕上,编译,汇编都会生成同名.s和.o文件。

链接会默认生成a.out文件。用-o 可以用文件接收

2.7 生成多个可执行文件

        我们知道make和makefile默认只生成一个可执行程序,从上到下将遇到的第一个作为目标文件。那么如何生成多个可执行程序呢?

 2.8 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中写的内容

隐晦规则:

 cc也是一个编译器。

 变量的定义和注释:

        makefile里也可以进行变量定义和注释

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值