Make工程管理器也就是个“自动编译管理器”,这里的“自动”是指它能构根据文件时间戳自动发现更新过的文件而减少编译的工作量,同时,它通过读入Makefile文件文件的内容来执行大量的编译工作 。
1、makefile基本结构
在一个Makefile中通常包含以下内容:
1、需要由make工具创建的目标体(target),通常是目标文件或可执行文件;
· 2、要创建的目标体所依赖的文件(dependency_file);
· 3、创建每个目标体时需要运行的命令(command),这一行必须以制表符(tab键)开头。
格式如下:
target: dependency_files
< TAB >command /* 该行必须以tab键开头*/
我们来看一个简单的例子,源文件为main.c ,1.c, 2.c 头文件为1.h, 2.h,功能很简单,1.c实现加法运算,2.c实现减法
运算。
我们按照上面提到的编写规则,把Makefile文件写出来即可,还是很简单的。使用时,在当前文件下使用make
命令即可。
2、Makefile变量
变量的种类:
1、用户自定义变量
2、预定义变量
3、自动变量
4、环境变量
用户自定义的变量也就是我们用户自己定义的变量,无需多讲
2.1 预定义变量
2.2 自动变量
2.3 环境变量
make在启动时会自动读取系统当前已经定义了的环境变量,并且会创建与之具有相同名称和数值的变量。如
果用户在makefile中定义了相同名称的变量,那么用户自定义变量将会覆盖同名的环境变量 。
在此,我们将之前的Makefile做一下简化。
另外,我们看到,main.o 1.o 2.o 的生成规则其实是一样的,我们可以采样模块化规则来简化
3、Makefile命令行选项
4 、Makef中基本函数
5、伪指令
伪目标并不是一个"目标(target)", 不像真正的目标那样会生成一个目标文件.典型的伪目标是 Makefile 中用来清理编
译过程中中间文件的 clean 伪目标。我们一般会用.PHONY:XXXX来表明一个伪指令。不加这句话有时候也能通过,
但是,如果当前文件夹有一个名为clean的文件,make clean就无法正常使用了,所以会添加这句指令。
6、 = := += ?=的区别
上述几个符号Makefile中对变量的赋值,但是又各有区别
我们先来看一下 = 的情况
.PHONY:all
XXX = abc
YYY = $(XXX)
$(info XXX = $(XXX))
XXX = ABC
all:
@echo "YYY = "$(YYY)
运行结果

我们可以看到XXX当前值为abc,但是YYY的值却是ABC,=并不会马上就行赋值,而是在Makefile中将等号右边的变量展开之后,将最后的值赋给等号左边的变量
:=的情况
.PHONY:all
XXX = abc
YYY := $(XXX)
$(info XXX = $(XXX))
XXX = ABC
all:
@echo "YYY = "$(YYY)
将YYY = $(XXX)变成YYY :=$(XXX)之后,会马上进行赋值,并不会展开,这种可以理解为最普通的情况

+=的情况,+=相当于append,后面继续追加值
.PHONY:all
XXX = abc
YYY := $(XXX)
$(info XXX = $(XXX))
XXX = ABC
YYY += $(XXX)
all:
@echo "YYY = "$(YYY)

?= 判断原变量是否为空,为空赋值,不为空则不会赋值
.PHONY:all
XXX = abc
YYY ?= $(XXX)
$(info XXX = $(XXX))
ZZZ = ABC
YYY ?= $(ZZZ)
all:
@echo "YYY = "$(YYY)

本文详细介绍了Makefile的基本结构、变量类型及使用方式、命令行选项、基本函数和伪指令等内容,帮助读者快速掌握Makefile的使用技巧。

被折叠的 条评论
为什么被折叠?



