Makefile快速入门
一、Makefile是什么?
Makefile 是一种文本文件,用于定义一个软件项目的构建和编译规则。它是 GNU Make 工具的配置文件,用于自动化构建过程。Makefile 中包含了一系列规则,每个规则定义了一个目标和相关的依赖,以及执行相应命令的规则。
简单来说Makefile是一系列编译命令的集合,通过定义了一系列的规则来指定哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译
二、为什么要使用Makefile
一句话来说就是:方便编译程序
举个栗子:一个执行文件需要链接多个.c文件,要是直接编译的话需要一长串的指令,而且当你的文件改变的时候你的指令也要重写,非常不灵活
使用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、嵌入式和单片机相关的干货知识。