makefile学习笔记

1.1 makefile简介

makefile通过定义一系列的规则来指定编译的顺序和实现许多功能操作,从而实现“自动化编译”,一旦写好makefile文件,只需要一个make命令,整个工程就会按照makefile的内容进行编译,极大的提高了软件开发的效率。概念比较抽象,可以看下面的例子就理解了。

make是一个命令工具,是一个解释makefile中指令的命令工具。

makefile文件会使用gcc编译器对源代码进行编译,最终生成可执行文件或者是库文件。

makefile文件的命名:一般把makefile文件命名为makefile或者Makefile。在使用make命令时系统会自动在当前目录搜索这两个文件名,而使用其他命名需要手动指定makefile文件。

1.2 makefile的基本规则

makefile的基本三要素:
1)目标:要生成的目标文件
2)依赖:目标文件由哪些文件生成
3)命令:通过执行该命令将依赖文件生成目标。

具体例子:sys:linux
当前目录下有main.c fun1.c fun2.c sum.c和head.h
图片
如果不用makefile文件,我们通常这样编译:
gcc -o main main.c fun1.c fun2.c sum.c
如果源文件很多,关系很复杂,这样编译就很容易出错。

用上面的规则写第一个版本的makefile文件

第一个版本
执行结果
这种写法缺点是,任何一个源文件发生了改变,所有的文件都会被重新编译,效率低。

1.3 makefile 工作原理

基本原则:
若想生成目标文件,检查规则中的所有依赖文件是否都存在
1)如果有的依赖文件不存在,则向下搜索规则,看是否有生成该依赖文件的规则:
如果有规则用来生成该依赖文件,则执行规则中的命令生成依赖文件;
如果没有规则用来生成该依赖文件,则报错。
图片

2)如果所有依赖都存在,检查规则中的目标是否需要更新,必须先检查它的所有依赖,依赖中有任何一个被更新,则目标必须更新。
检查规则:
若目标的时间 > 依赖的时间,不更新
若目标的时间 < 依赖的时间,则更新

图片
第二个版本:

第二个版本
不需要更新:
不需要更新
缺点:当.c文件很多时,编写起来比较麻烦

1.4 makefile中的变量

  1. 普通变量
  2. 自带变量
  3. 自动变量
    在makefile中使用变量类似于C语言中的宏定义,使用该变量相当于内容替换,是同变量可以使makefile易于维护,修改起来变得简单

普通变量
1)变量定义直接用 =
2)使用变量值用$(变量名)
如:

foo = main.c   //定义一个变量foo
bar = $(foo)   //使用变量foo

自带变量
除了用户自定义变量,makefile中也提供了一些变量(变量名大写)供用户直接使用,我们可以直接对其进行赋值,当然,不用也可以。
CC=gcc #arm-linux-gcc
CPPFLAGS:C预处理的选项 -I
CFLAGS:C编译器的选项 -Wall -g -c
LDFLAGS:链接器选项 -L -l

自动变量

  • $@:表示规则中的目标
  • $<:表示规则中的第一个条件
  • $^:表示规则中的所有条件,组成一个列表,以空格隔开,如果这个列表中有重复的项则消除重复项。

注意:自动变量只能在规则的命令中使用

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

第三个版本

1.5 makefile函数

makefile中的函数很多,这里介绍两个最常用的。

  • 1.wildcard :查找指定目录下的指定类型的文件
  • src=$(wildcard *.c) //找到当前目录下所有后缀为.c的文件,赋值给src
  • 2.patsubst:匹配替换
  • obj= ( p a t s u b s t (patsubst %.c,%.o, (patsubst(src))//把src变量中所有后缀为.c的文件替换成.o

在makefile中所有的函数都是有返回值的。
当前目录下有main.c fun1.c fun2.c sum.c
src= ( w i l d c a r d ∗ . c ) 就等价于 s r c = m a i n . c f u n 1. c f u n 2. c s u m . c o b j = (wildcard *.c) 就等价于 src = main.c fun1.c fun2.c sum.c obj= (wildcard.c)就等价于src=main.cfun1.cfun2.csum.cobj=(patsubst %.c ,%.o,$(src) )等价于 obj= main.o fun1.o fun2.o sum.o

第四个版本
缺点:每次重新编译都要手动清理中间的.o文件和最终目标文件

1.6 makefile的清理操作

用途:清除编译生成的中间.o文件和最终目标文件
第五个版本
clean:以可以去其他目标名字
.PHONY:clean:因为clean没有依赖,.PHONY:clean将clean声明为伪目标,makefile将不会检查该目标是否需要更新。不加不会影响。
make clean
用法

如果不使用makefile或者Makefile作为文件名,可以使用make -f 文件名
完

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值