关于 Makefile, 该知道这些

一 Makefile 的用途

(1)可用做于管理工程文件的工具

(2)make 是解释Makefile的解释命令工具

(3)可以提高工作效率,减少出错的几率。

二 基本规则

2.1  目标:依赖
             (tab)命令
目标 --> 要生成的目标文件。(关于伪目标,请看最后补充说明。
依赖 --> 生成目标文件需要的一些文件。
命令 --> 借助依赖文件生成目标文件的手段。忽略错误命令继续执行,不显示执行时候的命令细节。tab --> 缩进,有且只有一个。
2.2  Makefile会把规则中的第一个目标作为终极目标
all:app --> all指定生成的最终目标为app

make 如果不添加任何参数的话,默认把Makefile 中的第一个目标当做缺省目标,进行执行。

二 工作原理

(1)要想生成目标,那么依赖文件必须存在;

(2)若依赖文件不存在,则寻找是否有规则用来生成该依赖文件;

(3)目标和依赖之间的关系:预更新目标,必须先更新它的所有依赖;所有依赖只要有一个更新了,目标也会被随之更新。

举例:

假设Makefile 有一条规则A,则执行步骤为:

step1 : 先检查A 的每个条件P;

<1>若存在以P 为目标的规则B,则执行生成P 文件

<2>若不存在以P 为目标的规则,且P 文件存在,则不需要更新

<3>若不存在以P 为目标的规则,且P 文件 不存在,则报错

step2 : 检查完规则A的所有条件后,检查目标,符合以下条件,则需要更新目标T:

<1> 文件T 不存在,则执行命令

<2>文件T存在,但其依赖中有文件修改时间比T 晚

<3>某个条件被更新过(注意,该情形和<2>实质是不同的)

 基本原则:

检查规则中的所有条件,是否都存在

检查该规则中的目标,是否需要更新

 三  工作过程

step 1 : 从前往后,读取所有规则,建立依赖关系

step 2: 根据make 要执行的目标,选择适当的规则执行

 四  makefile中的变量

在Makefile 中,使用变量有点类似于C 语言中的宏定义,使用该变量,相当于内容替换。 

通过使用变量,可以使得Makefile 更易于维护,修改内容变得简单。

4.1  普通变量

1.定义变量格式:
	变量名 = 变量值 #最基本的赋值方式
	变量名 := 变量值 #覆盖之前的值,与=相似,效果更好,常用
	变量名 ?= 变量值 #若没有则赋值,有则保留原来的(不执行当前赋值)
	变量名 += 变量值 #在原来的基础添加
2.如何引用变量:
	$(变量名)=?? //给变量赋值
	??=$(变量名) //引用变量

例1:

foo = abc

bar = $(foo)

定义两个变量,foo 、bar, 其中bar的值 是 foo 变量值的引用

例2:

src = main.c fun1.c fun2.c

CC = gcc #arm-linux-gcc

CPPFLAGS : C 预处理器的选项,如: -I

CFLAGS : C 编译器的选项: -Wall -g -c

LDFLAGS: 链接器选项: -L -l

4.2 自动变量

$@ : 表示规则中的目标

$< : 表示规则中的第一个条件

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

 

4.3 模式规则 

至少在规则的目标定义中,要包含% ,%表示一个或者多个。

在依赖条件中,同样可以使用%。

但是,依赖条件中的%取值,取决于其目标。

例子:

%.c:%.c

        $(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o $@

其中,$@ : 表示依次取出目标值; $< : 依次取出依赖条件 

4.4  静态模式

语法:   目标集合: 目标模式:依赖模式

$(objs):%.o:%.c

目标模式:定义成 %.o , 表示是我们的目标集合中都是以 .o 结尾,而如果我们的依赖模式定义成%.c , 意思是对目标模式所形成目标集进行二次定义,其计算方法:取目标模式中的%(也就是去掉[.o] 这个结尾,并为其加上[.c]这个结尾,形成新的集合)。

%.o:%.c

        $(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o $@

注意:只有写成模式规则的时候,$< 才表示了所有依赖条件的依次取值;否则,只是取依赖条件中的第一个。

 五  makefile 可以的参数

六  makefile 中的函数

原则1: makefile 中的所有函数必须有返回值

<1> 函数名字: wildcard 

作用:找到指定目录下的指定类型的文件,一个参数

例子:  src = $(wildcard ./src/*.c)

<2> 函数名字:patsubst 

作用:匹配替换。从src 中找到所有.c 结尾的文件,并将其替换为.o 

例子 : obj = $(patsubst %.c,%.o,$(src))

七  伪目标

 

 八 其它

1.把生成的目标存放到其他的文件夹里面

DIR := ./debug/
$(DIR)test:$(DIR)test.o $(DIR)sequence.o
	gcc -o $(DIR)test.o $(DIR)sequence.o

2.makfile里面的注释使用#
3.命令如果不想显示到终端,在命令前加@
4.如果你命名的makefile文档名并非makefile,那么就要加上**-f**

  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

那么菜

你的鼓励和批评是我最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值