使——变量与函数的综合示例自动生成依赖关系

  

一。变量与函数的示例

  

<强>示例的要求
1。自动生成目标文件夹存放可执行文件
2。自动生成obj文件夹存放编译生成的目标文件
3。支持调试版本的编译选项
4。考虑代码的扩展性
<强>完成该示例所需的
1。美元(wildcardpattern)获取当前工作目录中满足模式的文件或目录列表
2。美元(addprefix _name)给名字列表名称的每一个名字增加前缀_prefix
<强>关键技巧
1。自动获取当前目录下的源文件列表(函数调用)

  
 <代码> SRC:=$(通配符* . c)  
  

2。根据源文件列表生成目标目标文件列表(变量的值替换)

  
 <代码> obj:=$ (src: c=. o)  
  

3。对每一个目标文件列表加上路径前缀(函数调用)

  
 <代码> obj:=$(美元/addprefix路径,(obj))  
  

<>强规则中的模式替换(目录结构)
让——变量与函数的综合示例自动生成依赖关系“> <br/>编译规则的依赖<br/> <img src=

  
 <代码> CC:=gcc
  MKDIR:=MKDIR
  RM:=RM - fr
  
  DIR_OBJS:=obj
  DIR_TARGET:=目标
  
  DIRS:=(DIR_OBJS) (DIR_TARGET)美元
  
  目标:=(DIR_TARGET)/hello-makefile.out美元
  #主要。c const。c func.c
  src:=$(通配符* . c)
  #主要。o const。o func.o
  obj:=$ (src . c=. o):
  # obj/主要。o obj/常量。o obj/func.o
  obj:=$ (addprefix (DIR_OBJS)/美元,美元(obj))
  
  .PHONY:重建干净
  
  (目标):美元(DIRS) (obj)美元
  $ (CC) - o $ @ $ (obj)
  目标文件==比@echo”;$ @”
  
  美元(DIRS):
  $ @ $ (MKDIR)
  
  美元(DIR_OBJS)/%。o: % . c
  ifeq($(调试),真的)
  $ (CC) - o - g - c $ @ $ ^
  其他的
  $ (CC) - o - c $ @ $ ^
  endif
  
  重建:清洁所有
  
  :$(目标)
  
  清洁:
  (RM)美元(DIRS)  
  

运行结果
让——变量与函数的综合示例自动生成依赖关系“> <br/> <强>小结:</强> <br/> 1。目录可以成为目标的依赖,在规则中创建目录<br/> 2。预定义函数是makefile不可或缺的部分<br/> 3。规则这的模式匹配可以直接针对目录中的文件<br/> 4。可以使用命令行变量编译特殊的目标版本</p>
  <h4>二。自动生成依赖关系</h4>
  <p> <强>一。编译行为带来的缺陷</强> <br/> 1。预处理器将头文件中的代码直接插入源文件<br/> 2。编译器只能通过预处理后的源文件产生目标文件的<br/>所以,规则中以源文件为依赖,命令可能无法执行<br/>示例<br/> <img src=使——变量与函数的综合示例自动生成依赖关系