工程管理器Make
Make工程管理器
1.Make工程管理器的优越性:
(1)使用 GNU 的 make 工具能够比较容易的构建一个属于你自己的工程,整个工程的编译只需要一个命令就可以完成编译、连接以至于最后的执行;(只需要一个make命令就可以完成需要对整个工程进行的操作,按Makefile中的代码自动编译,使用方便)
(2)在编译较多文件的项目中,如果仅仅一个源文件改变了,make会自动找到需要更新的目标进行编译和make, 也就是实现增量编译。就是能够根据程序中模块的修改情况,自动判断应该对那些模块重新编译,从而保证软件是由最新的模块构成。(仅仅对更新过的文件进行编译,没有修改则不再编译,极大地提高了编译效率)
2.Makefile基本介绍:
make工程管理器完全根据Makefile文件中的编译规则命令进行工作。
(1)Makefile文件由以下三项基本内容组成:
·需要生成的目标文件(target file)
·生成目标文件所需要的依赖文件(dependency file)
·生成目标文件的编译规则命令行(command)
这三项内容按如下格式进行组织:
target file:dependency file
command
(2)书写规则:
hello: hello.o
gcc hello.o –o hello
hello.o:hello.c
gcc –c hello.c
(3)Make工程管理器的编译过程:
①输入make命令,Make工程管理器会在当前目录下读取Makefile文件;
②查找Makefile文件中的第一个目标文件,该文件也是Make工程管理器本次编译任务的最终目标;
③把目标文件hello的依赖文件当做目标文件进行依赖规则检查,这是一个递归的检查过程。Make会根据以下三种情况进行处理:
·如果当前目录没有或缺少依赖文件,则执行其规则命令生成依赖文件。
·如果存在依赖文件,则把其作为目标文件来检查依赖规则(比如hello.c比hello.o新,则执行命令”gcc –c hello.c”,更新hello.o)。
·如果目标文件比所有文件新,则不做处理。
3.Makefile特性介绍:
(1)变量(4种实现方式):=,:=;+=;?=
(2)自动推导:自动推导功能默认每个目标文件都有与之对应的依赖文件,这样在Makefile中就不需要指定与目标文件相对应的依赖文件。
此外,自动推导功能还能推导出与目标文件对应的基本编译规则命令。
例如:
Obj =a.o b.o
test : $(obj)
gcc -o test $(obj)
a.o : b.h
结果为:
gcc -c -o a.o a.c
gcc -c -o a.o a.c
gcc -o test a.o b.o
(3)伪目标:伪目标不是真正的目标文件,可以让Make工程管理器只执行规则命令,而不用创建实际的目标文件(通常使用”.PHONY”对伪目标进行标识)。P20
(4)文件查找:
·VPATH。是一个特殊变量。Make在当前目录找不到源文件时会自动到VAPTH中指定的路径去寻找。使用方法:
VPATH =目录:目录..(或者搜索一个指定目录VPATH = 目录..)
例如:
VAPTH = /a : /b
Make会在当前路径找不到文件时按照次序依次查找/a和/b。
·vpath。是关键字。使用方法如下:
Vpath模式目录:目录..
例如:
vpath %.c /a : /b
Make会在当前路径找不到文件时按照顺序依次查找/a和/b目录中所有的c文件。
(5)嵌套执行:
把Makefile分解成多个子Makefile,并放置到程序的每个子目录中,每个子Makefile文件负责所在目录下源文件的编译工作。
①定义:Make工程管理器会首先读取根目录下的Makefile文件(总控Makefile),然后去读取各个目录中的子Makefile文件。这个过程就称为Make的嵌套执行。
②使用方法:
·cd 子目录 && $(MAKE)
·$(MAKE) c- 子目录
(6)条件判断:
①书写格式
条件表达式
如果真执行的文本段
endif
或者
条件表达式
如果真执行的文本段
else
如果假执行的文本段
endif
②条件表达式有一下四种格式:
·ifeq(参数1,参数2)。
作用:比较参数1和参数2的值是否相同,相同为真,相异为假
·ifneq(参数1,参数2)。
作用:比较参数1和参数2的值是否相同,相同为假,相异为真。
·ifdef(参数)。
作用:参数非空为真,空为假。
·ifndef(参数)。
作用:参数空为真,非空为假。
(7)函数:
①函数也用符号$标识,格式为:
$(函数名参数,参数…)
其中函数名和参数之间用空格隔开,参数与参数之间用”,”隔开。
②理解几个函数:
·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文件名。
·addsuffix。格式为
$(addsuffixx 参数1,参数2)
功能:在参数2中的每个单词后加上后缀参数1。返回值:加上后缀的所有单词。例如:
result := $(addsuffix .c,x y)
result 的值为”x.c y.c”。
·foreach。格式为
$(foreach 变量参数,参数1,表达式)
功能:循环取出参数1中的单词赋给变量参数,然后运行表达式。返回值:表达式的运行结果。例如:
a := x y z
result := $(foreach b,$(a),$(b).c)
result 的值为”x.c y.c z.c”。
注意,b在这里是一个临时变量。
·call。格式为
$(call 变量参数,参数…)
功能:循环把参数依次赋给变量参数中的$(1)、$(2)…。返回值:赋值后的变量值。例如:
a := $(2) $(1)
result := $(call $(a),x y)
result的返回值为”yx”。
补充:
1.Makefile首字母大写,方便识别
2.make -f Makefile1 (选择执行哪个Makefile文件)
3.Makefile**释为”#”
4.echo:打印
[email protected] + 命令:隐藏命令
6.gcc *.c编译当前目录下所有.c文件
7.tree:树状显示目录
8.推荐工程存储文件的目录格式:(阅读顺序:scripts/Makefile-->总控Makefile-->功能子目录Makefile)
·总控Makefile:进入各个功能子目录里执行make命令;
将所有的.o文件链接成可执行文件。
·功能子目录Makefile:将src目录下.c文件编译生成.o文件。
·scripts目录Makefile:定义变量(相当于c语言头文件)