您的位置:首页 > 运维架构 > Linux

【make工程管理器】linux下Make工程管理器简述_学习笔记_004

2016-07-09 19:48 615 查看
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:打印

       5.@  +  命令:隐藏命令

       6.gcc  *.c编译当前目录下所有.c文件

7.tree:树状显示目录

8.推荐工程存储文件的目录格式:(阅读顺序:scripts/Makefile-->总控Makefile-->功能子目录Makefile)

 


·总控Makefile:进入各个功能子目录里执行make命令;

                                    将所有的.o文件链接成可执行文件。

·功能子目录Makefile:将src目录下.c文件编译生成.o文件。

·scripts目录Makefile:定义变量(相当于c语言头文件)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息