C/C++-编译器(二):Makefile【包装所有g++指令】【描述文件编译的相关规则,告诉make要完成的shell指令】【一份定义了源文件间依赖关系、如何编译各个源文件并生成可执行文件的说明书】

本文详细介绍了Makefile的作用、语法、工作原理,以及如何通过Makefile实现项目的自动化编译。重点阐述了Makefile如何解决大量代码的依赖维护和减少重复编译时间的问题,同时提供了多个Makefile示例,帮助读者掌握Makefile的编写技巧。
摘要由CSDN通过智能技术生成

一、概述

1、make简介

make是一个指令工具,它解释makefile中的指令或者说规则。makefile文件描述了整个工程中所有文件的编译顺序,编译规则。Makefile也有自己的编写规则,通常,我们所使用的IDE都会生成相应的makefile,然后再根据makefile来进行编译,只是这些操作是由IDE来完成,我们只需要点击一个编译按钮。

2、为什么要使用make

现在可以在GitHub上看到,很多的开源项目,在编译的时候,都是使用make来完成的,也就是说,都有其对应的makefile。他们都有个特点,那就是文件很多。

考虑这样一种情况,我们的项目现在有三、四十个文件,你使用的不是IDE工具,而是命令行,那么不同的人,在编译你的项目的时候,都需要一个一个文件的

gcc -o asample.c bsample.c ...... xxx.out

这样慢慢的一个文件,一个文件的去找到以后再编译吗?

答案肯定是否定的,当你工程的文件多了以后,时间一长,可能你自己都不能记住所有的文件。

所以,这个时候我们就可以使用make来根据makefile对整个项目进行管理。

除此之外,make还有一个优点,那就是当你修改你的文件以后,make只会编译更新的文件以及它相关依赖的文件

这里后边进行详细的解释,意思就是,当你只修改了几十个文件中的某一个文件时,make只会重新编译跟你修改的文件有关联的文件,而不是所有的文件。这就大大的减短了编译的时间。

3、makefile简介

在我们执行make之前,需要有一个名为makefile或Makefile的文件。

这个文件用来告诉make需要完成什么样的操作。

我们可以简单的把makefile认为是一份定义了源文件间依赖关系、如何编译各个源文件并生成可执行文件的说明书。

一个工程中的源文件不计其数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为 makefile就像一个Shell脚本一样,其中也可以执行操作系统的命令。

Makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,makefile都成为了一种在工程方面的编译方法。

4、make主要解决两个问题

4.1 大量代码的关系维护

大项目中源代码比较多,手工维护、编译时间长而且编译命令复杂,难以记忆及维护。

把代码维护命令及编译命令写在makefile文件中,然后再用make工具解析此文件自动执行相应命令,可实现代码的合理编译

4.2 减少重复编译时间

在改动其中一个文件的时候,能判断哪些文件被修改过,可以只对该文件进行重新编译,然后重新链接所有的目标文件,节省编译时间。

5、Makefile文件命名规则

makefile和Makefile都可以,推荐使用Makefile。

6、make工具的安装

sudo apt install make

二、Makefile语法

1、Makefile语法规则

一条规则:

  • 目标:依赖文件列表
  • 命令列表

Makefile基本规则三要素:

  • 目标
    • 通常是要产生的文件名称,目标可以是可执行文件或其它obj文件,也可是一个动作的名称
  • 依赖文件
    • 用来输入从而产生目标的文件
    • 一个目标通常有几个依赖文件(可以没有)
  • 命令
    • make执行的动作,一个规则可以含几个命令(可以没有)
    • 有多个命令时,每个命令占一行

2、Makefile文件格式

主要包含3个区域:

  1. 变量定义区域;此处可以由if…else…等语法;
  2. 依赖关系区域;
  3. 指令区域;

3、Makefile文件详细规则

3.1 变量定义区域

Makefile文件的数据类型:

  • 只有字符串类型;
  • 多个字符串以空格隔开之后可以看做为数组;

3.2 依赖关系区域

格式:生成项 : 依赖项01 依赖项02 依赖项03 : 父级依赖项01 父级依赖项

  1. 生成一个生成项的时候,会优先生成依赖项,即会优先去找依赖项的生成指令,并执行生成;
  2. 如果生成项的修改时间比依赖项更新的话,就什么也不会执行;表明生成项是最新的,不需要重新编译;
  3. make指令会将Makefile中的生成项是做单独的文件;
    mask demo1
    

三、make命令格式

make是一个命令工具,它解释Makefile 中的指令(应该说是规则)。

make命令格式: make [ -f file ][ options ][ targets ]

  • [ -f file ]
    • make默认在工作目录中寻找名为GNUmakefile、makefile、Makefile的文件作为makefile输入文件
    • f 可以指定以上名字以外的文件作为makefile输入文件
  • [ options ]
    • -v: 显示make工具的版本信息
    • -w: 在处理makefile之前和之后显示工作路径
    • -C dir:读取makefile之前改变工作路径至dir目录
    • -n:只打印要执行的命令但不执行
    • -s:执行但不显示执行的命令
  • [ targets ]
    • 若使用make命令时没有指定目标,则make工具默认会实现makefile文件内的第一个目标,然后退出
    • 指定了make工具要实现的目标,目标可以是一个或多个(多个目标间用空格隔开)。

示例:

在这里插入图片描述

四、Makefile工作原理

若想生成目标, 检查规则中的依赖条件是否存在,如不存在,则寻找是否有规则用来 生成该依赖文件

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值