工程管理器(make):实际上是借助了makefile文件来进行执行。
Make的作用:(实现了批处理)
为什么我们要使用该工具?
(1):使用方便:即每次编译时不用在频繁的输入gcc命令,直接根据makefile编译规则
来命令自动对源文件编译和链接。
(2):调试效率高:在时间戳内修改了一个源文件,只编译被修改的文件,而不用从头
始编译,避免了多余的编译工作量。
Makefile:(属于脚本文件------脚本语言)
由三项基本内容组成:
(1):需要生成的目标文件。
(2):生成目标文件所需要的依赖文件。
(3):生成目标文件的编译规则命令行
*Makefile规定在书写命令行前必须加一个<Tab>键:(系统默认是缩进8格)
如://Makefile:
test : a.o b.o
gcc -o test a,o b.o
a.o : a.c b.h
gcc -c a.c
b.o : b.c
gcc -c b.c
<makefile :为什么.c文件要先生成.o文件,在生成可执行文件?>
因为,在一个工程中,有许多的.c源文件,而先编译成.o文件是当你要改其中的一个源文件时,只需要编译相应的,o文件,而其他文件没有改变,所以相应的.o文件也不变,只需要编译改变的源文件。提高了代码的编译速度(企业最关心的)
Makefile特性:
* $(变量名):变量的命名可以是字符、数字、下划线。
* “=”:递归赋值:如果右侧包含的其他变量的值发生变化时,被赋值变量的值也随
之变化。
* “:=”直接赋值:
* “+=”追加赋值:
* “?=”条件赋值: 如果变量原来无值则赋值,否则保持原来的值。
伪目标:伪目标不是真正的目标文件,只是一个符号,使用“.PHONY”对它进行标识。
一些常用的基本函数:
*subst: 格式:$(subset参数1,参数2,参数3)
功能:把参数3中的参数1替换成参数2,。返回值:被替换后的参数3.
如:result := $(subst china, the world, I love China)
Result的值为“I love the world”
*patsubst: 格式:$(patsubst模式参数,参数1,参数2)
功能:把参数2中符合模式参数的单词替换成参数1.返回值:被替换后的参数2.
如:result := $(patsubst %.c,%.o,x.c y.c)
Result的值为“x.o y.o”
*wildcard: 格式:$(wildcard模式参数)
功能:列出当前目录下所有符合模式参数的文件名。返回值:当前目录下所有符合模式
参数的文件名。
如:result := $(wildcard *.c)
Result的值为当前目录下的所有c文件名。
*findstring 格式:$(findstring参数1,参数2)
功能:在参数2中查找参数1,。返回值:如果找到返回参数1,没找到返回空。
如:result := $(findstring me, you and me )-----result的值为“me”.
Result :=$(fingstring she, you and me)----result的值为“”。
*filter 格式:$(filter模式参数, 参数1)
功能:从参数1中筛选符合模式参数的字符串。返回值:符合参数模式的字符串。
如:a := x.c y.c z.h
Result := $(filter %.c, $(a))
Result的值是“x.c y.c”
*addsuffix 格式:$(addsuffix参数1,参数2)
功能:在参数2中的每个单词加上后缀参数1.返回值:加上后缀的所有单词。
如:result := $(addsuffix .c, x y)
Result:的值为“x.c y.c”
*addprefix 格式:$(addprefix 参数1, 参数2)
功能:在参数2中的每个单词加上前缀参数1。返回值:加上前缀的所有单词。
如:resut := $(addprefix src/ , x.c y.c)
Result 的值为“src/x.c src/y.c”
*foreach 格式: $(foreach变量参数,参数1,表达式)
功能:循环取出参数1中的单词赋给变量参数,然后运行表达式。返回值:表达式的结果
如: a := x y z
Result := $(foreach b, $(a), $(b).c)
Result的值为“x.c y.c z.c”
*call 格式:$(call变量参数,参数.....)
功能:循环把参数依次赋给变量参数中的$(1)、$(2)...,。返回值:赋值后的变量值。
如: a := $(2) $(1)
Result := $(call $(a), x y)
Result的值为“yx”
*if 1格式:$(if条件参数, 执行参数)
功能:如果条件参数非空,运行执行参数部分。返回值:条件参数非空,返回执行参数
如: result := $(if China, world)
Result的值为“world”
2格式:$(if条件参数,执行参数1,执行参数2)
功能:如果条件参数非空,运行执行参数1;反之运行执行参数2.
返回值:条件参数非空,返回执行参数1;反之返回执行参数2.
如:a :=
Result := $(if $(a), china, world)
Result的值为“world”
*dir 格式:$(dir参数)
功能:从参数中取出目录部分。返回值:目录部分。
如: result := $(dir /home/test/a.c)
Result的值为“/home/test”
*error 格式:$(error参数)
功能:停止“make”运行名显示参数。返回值:参数。
如:result := $(error error occure!)
Result的值为“error occure!”
*warning 格式:$(warning参数)
功能:“make”运行时显示参数。返回值:参数。
如:result := $( warning warning occure!)
Result的值为“warning occure!”
对于一个工程文件来说,它包含了许多源文件,而这些源代码按照功能不同都放在各自功能的目录下。因此,查看一个工程文件,应查看它每个目录下的Makefile,大致个分为这三类:scripts目录下的Makefile、总控Makefile、功能子目录下的Makefile。
首先查看的是:scripts目录下的Makefile:里面定义了许多变量,相当于c语言中的头文件。
其次查看的是:总控Makefile:作用是进入各个功能子目录下去执行make命令。
最后查看的是:功能在目录下的Makefile:将src目录下的 .c文件编译成 .o文件。