Linux中的make以及Makefile文件

文章介绍了Makefile文件的作用,它是管理多文件项目编译顺序和规则的文件。对比了gcc和make的区别,make能根据文件时间戳减少不必要的重编译,提高效率。Makefile包括目标文件、依赖文件和命令,以及变量的使用,如自定义变量、赋值运算符等。文章还提到特殊变量如$^,$@,$<和%,帮助简化Makefile编写。
摘要由CSDN通过智能技术生成

一、Makefile文件和make工具

简单来说,Makefile就是一个文件,他管理了多个文件
make 是一个命令工具,它解释 Makefile 中的指令(应该说是规则),在 Makefile 文件中描述了整个工程所有文件的编译顺序、编译规则

二、为什么要用Makefile文件

在我们刚学习linux期间,大多使用的是gcc编译器来编译 .c 文件,并且写的代码就几十行,都在一个 .c 文件中,但是当我们以后进入公司之后,代码可能会变成几千上万行,那个时候就会使用多文件进行封装,每个同事负责某一个功能,最后再整合起来。

gcc和make的区别

  • 两者都可以生成可执行文件,gcc是在编译时,不管编译几次都会把所有文件都重新编译,比如现在我有 1.c 2.c 3.c 4.c ,这四个文件之前编译过一次,现在我只修改了 3.c 但是如果我重新用gcc编译,他还是会把 1.c 2.c 3.c 4.c 全部重新编译,大大降低了开发效率,如果代码量很大,那么编译都需要很久
  • make则是根据文件的时间戳来进行编译,如果文件的时间戳没有发生改变,则不会编译该文件,大量减少了编译的时间

三、Makefile文件

1.认识Makefile文件

这里我创建一个Makefile文件,直接使用 vim makefile

在这里插入图片描述
在这里插入图片描述

 注意: Makefile 文件中,命令行前面是用 tab 键来缩进的,不能用空格空格键
       如果命令行是用 tab 键来缩进,那命令行就会变颜色

2.Makefile文件格式

上一个Makefile文件中使用的还是 gcc 编译器,而Makefile文件由一系列规则构成。每条规则的形式如下

    目标文件:依赖文件
    			命令
  • 目标文件一般就是最终生成可执行文件,而生成目标文件需要去找他所需的所有依赖文件,如果依赖文件也需要其他的文件,就一直找,直到不需要依赖文件,就好比递归,需要一层一层递归,直到最后不需要为止

这里拿 add.c add.h main.c 来举例,我现在需要把 add.c 和 main.c编译出可执行文件
在这里插入图片描述
在这里插入图片描述

 执行该Makefile文件

在这里插入图片描述
执行完该Makefile文件后,显示了文件中的执行命令,并且文件中多出了 add.o , main.o 还有我们想要的myadd可执行文件
我们写的这个Makefile中还有一句标签为

clean:
      rm -f *.o myadd

而这里的clean只是一个标签名,我们可以使用make工具来操作这行命令,例如
在这里插入图片描述
执行之后,所有 .o 文件和myadd可执行文件也被删除了

四、Makefile中的变量

1.自定义变量

Makefile 中允许使用等号自定义变量
Makefile中的变量定义和 shell 变量的定义非常相似,不同的是 Makefile中的变量的名称可以是任何不包含 :, #,= 和空字符的字符序列,并且等号两边可以有空格(shell 定义变量的等号两个不允许出现空格)

变量名=值       --等号两边不能有空格

在这里插入图片描述

2.变量的调用

make 变量支持和 shell 变量一样,在变量标识符前加美元符 $ 来引用,例如
在这里插入图片描述
在这里插入图片描述
如果你不想看到执行命令时,把makefile中的命令再打印一遍可以在makefile中的命令前加一个@
在这里插入图片描述
在这里插入图片描述

3.变量的赋值

Makefile一共提供了四个赋值运算符 (=、:=、?=、+=)

1).普通赋值 =

如果按照c语言的逻辑,var2应该等于12,但是这里最后打印var2的值为100,所以普通赋值表示赋值最新的变量值在这里插入图片描述 在这里插入图片描述

2).立即赋值 :=

立即赋值则是直接赋值,不会在改变
在这里插入图片描述
在这里插入图片描述

3).询问赋值 ?=

如果该变量前面已经赋过值了,此次就不能再赋值了,如果没有就赋值,只有在该变量为空时才设置值
在这里插入图片描述
在这里插入图片描述

4.追加赋值 +=

类似字符串连接,将值追加到变量末尾,在追加的时候,自动添加空格
在这里插入图片描述
在这里插入图片描述

4.特殊变量

$^         --表示所有依赖文件
$@         --表示目标文件
$<         --表示第一个依赖文件
%          --通配符,表示所有,和linux中的 * 一样

利用这些特殊变量和自定义变量,我们就可以将Makefile文件写的更加简洁
在这里插入图片描述

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值