Makefile学习笔记

参考资料:正点原子linux驱动开发指南

在正文开始之前举一个例子方便理解
Makefile学习笔记
如上所示,有3个C文件,2个h文件,位于同一目录下,当在ubuntu中不使用Makefile编译的时候,输入的指令为
gcc main.c calcu.c input.c -o main
为什么使用Makefile就不想解释了,就是因为方便、好用呗
在书写Makefile的时候,在同一目录下建立Makefile文件,要注意首字母是大写。。
Makefile学习笔记
在Makefile中的写入:
Makefile学习笔记
然后输入make就可以编译了
输入make clean可以将所有的.o文件以及main目标文件删除
注:在运行make和make clean的过程中可能会出现小问题,百度都可以解决

Makefile语法

1. Makefile规则格式

目标…… : 依赖文件集合……
命令 1
命令 2
……

命令列表中的每行命令必须以TAB键开始,不能使用空格

2.Makefile变量

Makefile 中的变量都是字符串!类似 C 语言中的宏

赋值符"=", “:=”, “?=”

三者的区别是:
使用“=”时,可以使用后面定义的值
Makefile学习笔记
输入make print输出:
Makefile学习笔记
这里的解释是:前面虽然定义了name的值为zzk,但是也可以使用后面定义的name = liang输出。

使用“:=”时,不使用后面定义的值
Makefile学习笔记
输入make print输出:
Makefile学习笔记
尽管后面重新定义了一次name的值,但是还是输出前面的zzk

使用“?=”时
currname ?= liang
这句代码的意思是如果变量前面没有被赋值,那么currname的值就是liang,如果赋值了就是前面的值

注释和引用

在Makefile中,注释使用的是#

变量引用的方法是$(变量名)
objects = main.o input.o calcu.o
main: $(objects)
cc -o main $(objects)
这里使用object代指 main.o input.o calcu.o三个值

3.Makefile模式规则

在前面我们编写了一个这样子的Makefile文件来编译工程
Makefile学习笔记
但是第3句到第8句总觉得有点重复,那么使用一条怎样的规则,将所有的.c文件,编译成对应的.o文件呢???
使用的是“%”,“%”表示长度任意的非空字符串,如果要表示所有以.c结尾的文件,可以写成"%.c",相当于是一个通配符,“a.%c.c”,表示的是以a.开头以.c结尾的所有文件。

所以main.o:main.c, input.o:input.c, calcu.o:calcu.c可以统一写成%.o:%.c

4.Makefile自动化变量

通过一行命令来从不同的依赖文件中生成对应的目标?自动化变量就是完成这个功能的!所谓自动化变量就是这种变量会把模式中所定义的一系列的文件自动的挨个取出,直至所有的符合模式的文件都取完,自动化变量只出现在规则的命令中。
Makefile学习笔记
常用的只有$ @、$ <、$ ^
使用自动化变量之后的Makefile就变成了下面这样
Makefile学习笔记

5.Makefile伪目标

使用伪目标的主要是为了避免 Makefile 中定义的只执行命令的目标和工作目录下的实际文
件出现名字冲突。

在Makefile中插入.PHONY:clean
声明 clean 为伪目标以后不管当前目录下是否存在名
为“clean”的文件,输入“make clean”的话规则后面的 rm 命令都会执行。

makefile的知识点还有很多,我常有的就这些吧