3.Linux编程-makefile

本文详细介绍了makefile的工作原理、基本规则、变量、自动变量、模式规则和函数,阐述了如何利用makefile自动化编译,提高开发效率。通过不同版本的makefile示例,展示了从基础到进阶的编写过程,并讲解了如何进行清理操作以管理编译产生的中间文件。
摘要由CSDN通过智能技术生成
  • makefile文件中定义了一系列的规则来指定, 哪些文件需要先编译, 哪些文件需要后编译, 哪些文件需要重新编译, 甚至于进行更复杂的功能操作, 因为makefile就像一个Shell脚本一样, 其中也可以执行操作系统的命令. makefile带来的好处就是——“自动化编译”, 一旦写好, 只需要一个make命令, 整个工程完全自动编译, 极大的提高了软件开发的效率.
  • make是一个命令工具, 是一个解释makefile中指令的命令工具, 一般来说, 大多数的IDE都有这个命令, 比如:Visual C++的nmake, Linux下GNU的make. 可见, makefile都成为了一种在工程方面的编译方法.
  • makefile文件中会使用gcc编译器对源代码进行编译, 最终生成可执行文件或者是库文件.
  • makefile文件的命名:makefile或者Makefile

makefile的基本规则

makefile由一组规则组成,规则如下:

目标: 依赖
(tab)命令

makefile基本规则三要素:

目标: 要生成的目标文件
依赖: 目标文件由哪些文件生成
命令: 通过执行该命令由依赖文件生成目标

下面以具体的例子来讲解:
当前目录下有main.c fun1.c fun2.c sum.c, 根据这个基本规则编写一个简单的makefile文件, 生成可执行文件main.

第一个版本的makefile:
在这里插入图片描述

缺点: 效率低, 修改一个文件, 所有的文件会全部重新编译.

makefile工作原理

基本原则:

  • 若想生成目标, 检查规则中的所有的依赖文件是否都存在:

    • 如果有的依赖文件不存在, 则向下搜索规则, 看是否有生成该依赖文件的规则:
      如果有规则用来生成该依赖文件, 则执行规则中的命令生成依赖文件;
      如果没有规则用来生成该依赖文件, 则报错.
      在这里插入图片描述
  • 如果所有依赖都存在, 检查规则中的目标是否需要更新, 必须先检查它的所有依赖,依赖中有任何一个被更新, 则目标必须更新.(检查的规则是哪个时间大哪个最新)

    • 若目标的时间 > 依赖的时间, 不更新
    • 若目标的时间 < 依赖的时间, 则更新
      在这里插入图片描述

总结:
分析各个目标和依赖之间的关系
根据依赖关系自底向上执行命令
根据依赖文件的时间和目标文件的时间确定是否需要更新
如果目标不依赖任何条件, 则执行对应命令, 以示更新(如:伪目标)

第二个版本:

在这里插入图片描述

缺点: 冗余, 若.c文件数量很多, 编写起来比较麻烦.

makefile中的变量

在makefile中使用变量有点类似于C语言中的宏定义, 使用该变量相当于内容替换, 使用变量可以使makefile易于维护, 修改起来变得简单。
makefile有三种类型的变量:

普通变量
自带变量
自动变量

普通变量

变量定义直接用 =
使用变量值用 $(变量名)

:下面是变量的定义和使用
foo = abc			// 定义变量并赋值
bar = $(foo)		// 使用变量, $(变量名)

定义了两个变量: foo、bar, 其中bar的值是foo变量值的引用。
除了使用用户自定义变量, makefile中也提供了一些变量(变量名大写)供用户直接使用, 我们可以直接对其进行赋值:

CC = gcc #arm-linux-gcc
CPPFLAGS : C预处理的选项 -I
CFLAGS:   C编译器的选项 -Wall -g -c
LDFLAGS :  链接器选项 -L  -l

自动变量

KaTeX parse error: Unexpected character: '' at position 13: @: 表示规则中的目标 ̲<: 表示规则中的第一个条件
$^: 表示规则中的所有条件, 组成一个列表, 以空格隔开, 如果这个列表中有重复的项则消除重复项。
特别注意:自动变量只能在规则的命令中使用.

模式规则

至少在规则的目标定义中要包含’%’, ‘%’表示一个或多个, 在依赖条件中同样可以使用’%’, 依赖条件中的’%’的取值取决于其目标:
比如: main.o:main.c fun1.o: fun1.c fun2.o:fun2.c, 说的简单点就是: xxx.o:xxx.c

makefile的第三个版本:

在这里插入图片描述

makefile

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

数哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值