Makefile快速入门

一、Makefile是什么?

Makefile 是一种文本文件,用于定义一个软件项目的构建和编译规则。它是 GNU Make 工具的配置文件,用于自动化构建过程。Makefile 中包含了一系列规则,每个规则定义了一个目标和相关的依赖,以及执行相应命令的规则。
简单来说Makefile是一系列编译命令的集合,通过定义了一系列的规则来指定哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译

二、为什么要使用Makefile

一句话来说就是:方便编译程序
举个栗子:一个执行文件需要链接多个.c文件,要是直接编译的话需要一长串的指令,而且当你的文件改变的时候你的指令也要重写,非常不灵活
使用gcc命令直接编译
使用Makefile文件后可以使用通配符和各种函数去构造我们编译的规则,不管是有多少.c都可以用make命令自动构建。Makefile我们常用的就是在linux的c文件的编译,对于初学者我们可以记住一个通用的模版运用到我们的工程中。在这里插入图片描述

三、Makefile一下基础知识

1.函数介绍

Wildcard(通配符函数)

      这个函数的主要作用是获取指定目录下指定类型的文件名
  函数使用如下:

在这里插入图片描述

Patsubst(字符替换函数)

函数使用如下:
在这里插入图片描述

2.Makefile基本命令格式

在这里插入图片描述

3.一些常见的自动变量

在 Makefile 中,自动变量是预定义的变量(可以认为就是官方定义好的变量用来代表一些特殊的含义),它们在规则的命令中具有特殊的含义,可以用来引用与当前规则相关的文件和目录。
在这里插入图片描述

四、模版步骤解释

1.原始的版本

我们假设在一个目录下有1.c 2.c 和一个Makefile文件(Makefile必须命名为Makefile或者makefile
在这里插入图片描述
我们按照Makefile的基本格式结合gcc命令很容易就可以编写一份编译1.c和2.c的Makefile文件,参考如下
在这里插入图片描述
这时候我们在终端上执行make命令,就会生成相应的.o和可执行文件test
在这里插入图片描述
我们再执行一下make clean命令,这时候就会删除.o和可执行文件test
在这里插入图片描述

1.1原始模版的一些缺点

  • 臃肿,当依赖文件比较多的时候,我们要写很多重复性的代码
  • 这种Makefile文件的可移植性不高,因为你不能保证你所有的项目的依赖文件的名称(xxx.c或者xxx.o)和生成的文件名字是一样的

2.改进后的版本

在这里插入图片描述

  • src = $(wildcard *.c),用src变量记录当前目录下的.c文件
  • obj = $(patsubst %.c, %.o, $(src)),使用patsubst 函数将src中的.c文件替换成.o文件,记录在obj变量中
  • target = test,定义生成可执行文件的名称
  • $(target) : $(obj)

要注意的是在Makefile里,使用变量时,需要在变量前面加上
$然后用()括号括起来。target是目标文件名、obj是依赖的.o文件。这一句就行相当于原始版本中的 test : 1.o 2.o

  • gcc -o $@ $^

这里是使用了Makefile中的自动变量,$@表示目标文件的名称
$^表示所有的依赖文件

  • %.o : %.c
  • gcc -c -o $@ $<

$@表示目标文件的名称,即.o文件。
$<表示第一个依赖文件,简单来说就是用一个.c文件生成一个.o文件

  • .PHONY : clean

这一句是为了防止你的生成文件与clean重名,执行make clean的时候能正常的执行rm的命令

总结

总的来说,对于初学者来说我们刚开始记住一个通用的Makefile模版就能够胜任大部分的编译工作。

PS作者也是一枚小白,如文中有错误的地方还请多多指教
在这里插入图片描述

可以扫码关注或者微信搜索乐天小白我的个人公众号,里面不定期更新各种干货,有最新的科技咨询和前沿的科技知识分享,还有Linux、嵌入式和单片机相关的干货知识。

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值