静态模式

makefile中,一个规则中可以有多个目标,规则所定义的命令对所有的目标有效。一个具有多目标的规则相当于多个规则。使用多目标可以使makefile文件变得简洁。
      静态模式规则是这样一个规则:规则存在多个目标,并且不同的目标可以根据目标文件的名字来自动构造出依赖文件。
      静态模式可以更加容易地定义多目标的规则,可以让我们的规则变得更加的有弹性和灵活。我们还是先来看一下语法:

<targets ...>: <target-pattern>: <prereq-patterns ...>
            <commands>
            ...

targets定义了一系列的目标文件,可以有通配符。是目标的一个集合。

target-parrtern是指明了targets的模式,也就是的目标集模式。

prereq-parrterns是目标的依赖模式,它对target-parrtern形成的模式再进行一次依赖目标的定义。

简单的解释一下:如果我们的<target-parrtern>定义成 “%.o”,意思是我们的<target>集合中都是以“.o”结尾的,而如果我们的<prereq-parrterns>定义成“%.c”,意思是对<target-parrtern>所形成的目标集进行二次定义,其计算方法是,取<target- parrtern>模式中的“%”(也就是去掉了[.o]这个结尾),并为其加上[.c]这个结尾,形成的新集合。

所以,我们的“目标模式”或是“依赖模式”中都应该有“%”这个字符,如果你的文件名中有“%”那么你可以使用反斜杠“\”进行转义,来标明真实的“%”字符。

看一个例子:

objects = foo.o bar.o

all: $(objects)

$(objects): %.o: %.c
            $(CC) -c $(CFLAGS) $< -o $@

上面的例子中,指明了我们的目标从$object中获取,“%.o”表明要所有以“.o”结尾的目标,也就是“foo.o bar.o”,也就是变量$object集合的模式,而依赖模式“%.c”则取模式“%.o”的“%”,也就是“foo bar”,并为其加下“.c”的后缀,于是,我们的依赖目标就是“foo.c bar.c”。而命令中的“$<”和“$@”则是自动化变量(见[makefile笔记]之七),“$<”表示所有的依赖目标集(也就是 “foo.c bar.c”),“$@”表示目标集(也就是“foo.o bar.o”)。于是,上面的规则展开后等价于下面的规则:

foo.o : foo.c
            $(CC) -c $(CFLAGS) foo.c -o foo.o
    bar.o : bar.c
            $(CC) -c $(CFLAGS) bar.c -o bar.o

试想,如果我们的“%.o”有几百个,那种我们只要用这种很简单的“静态模式规则”就可以写完一堆规则,实在是太有效率了

Makefile之静态模式(7)相关推荐

  1. Makefile3、书写规则(文件搜寻、伪目标、多目标、静态模式、自动生成依赖性)

    第三部分.书写规则 规则包含两个部分,一个是依赖关系,一个是生成目标的方法.在 Makefile 中,规则的顺序是很重要的,因为,Makefile 中只应该有一个最终目标,其它的目标都是被这个目标所连 ...

  2. ****** 五十 ******、软设笔记【UML分析和意义】-类图、对象图、状态图、活动图、顺序图、协作图、构件图、部署图,动静态模式...

    一.类图(Class Diagram) 描述一组类.接口.协作已经它们之间的图,用来显示系统中各个类的静态结构图. 类之间的关系(relationship) *依赖(dependency) *泛化(g ...

  3. PHP编译为静态库,makefile生成静态库和动态库

    库是一种软件组件技术,库里面封装了数据和函数. 库的使用可以使程序模块化. Windows系统包括静态链接库(.lib文件)和动态链接库(.dll文件). Linux通常把库文件存放在/usr/lib ...

  4. 对 makefile 中 $*和静态模式规则结合的学习

    上例子 LIBS=foo.k bar.k.PHONY : allall: $(LIBS)@echo final$(LIBS): %.k : text.g@echo $*text.g:echo text ...

  5. Makefile、多Makefile编译静态库、动态库、SRC实例总结

    静态库生成及使用 calc.h #ifndef __MY_LIB_H__ #define __MY_LIB_H__ int add(int a, int b); #endif calc.c #incl ...

  6. Makefile生成 静态链接库万能模板(当前文件夹、递归全部文件夹编译成.a)

    感谢:Makefile常用万能模板(包括静态链接库.动态链接库.可执行文件) https://www.bbsmax.com/A/Vx5MyvWv5N/ 单文件下makefile编译成静态 ###### ...

  7. linux解决make依赖关系,makefile 自动处理头文件的依赖关系

    现在我们的Makefile写成这样: all: main main: main.o stack.o maze.o gcc $^ -o $@ main.o: main.h stack.h maze.h ...

  8. H3C 交换机配置静态聚合(trunk/access)模式

    目标: H3C 交换机配置静态聚合(trunk/access)模式 硬件配置: 1.三层核心交换机:S7005e 2.二层交换机:S5120 v2 S7005e过程: 创建vlan(如果已经存在可跳过 ...

  9. 浅显易懂 Makefile 入门 (12)— Makefile 常见的错误信息

    1. 常见的错误信息 make 执行过程中所产生错误并不都是致命的,特别是在命令行之前存在 -.或者 make 使用 -k 选项执行时. make 执行过程的致命错误都带有前缀字符串 ***.错误信息 ...

最新文章

  1. 为何云原生在吞噬世界 ?
  2. Node.js:Web模块、文件系统
  3. 关于YOLO算法的备忘
  4. 循环卷积和周期卷积的关系_基于单口RAM读写的卷积电路(下)
  5. Makefile中怎么使用Shell if判断
  6. 使用SafeViewFlipper避免ViewFlipper交替时Crash
  7. android企业手机安全软件开发,基于Android的手机安全管理软件的设计与实现毕业论文.doc...
  8. Maven中dependencyManagement的使用
  9. 英特尔第11代台式机处理器发布:或将是14nm最后的倔强
  10. linux英文包安装教程视频,Linux源码包安装过程讲解
  11. 51Nod-2149 字符串出现位置【水题】
  12. Win XP 精简版安装SQL Server
  13. proj4js 坐标转换
  14. 装linux双系统有什么好处,科学网—Windows和Linux双系统安装教程 - 戴劭勍的博文...
  15. 红光光浴可以加速血液循环,完全放松身体各个部位的肌肉
  16. 【ThreadPoolTaskExecutor】 SpringBoot 的线程池的使用
  17. Opencascade 开发 1章
  18. 回顾Vue2---②
  19. CVPR2019 Learning to Reduce Dual-level Discrepancy for Infrared-Visible Person Re-identification
  20. AAB 扶正!APK 将退出历史舞台

热门文章

  1. Linux学习笔记-使用gdb调试
  2. Qt工作笔记- 解决cc1plus.exe: error: out of memory allocating
  3. Qml学习笔记-Repeater的基本使用
  4. linux bash lsnrctl,[转]lsnrctl: command not found
  5. 在java中为什么_属性绑定到类型_方法绑定到对象_13. Java基础之类型信息(RTTI和反射)...
  6. excel 单元格求和大于某个数后返回列号_Excel最常用的几个函数,我都帮你整理好了!...
  7. android OEM unlocking分析
  8. linux c计算两个int相除求百分比的实现
  9. 图解Public,protected ,private和什么也不填的区别
  10. 操作系统之内存管理:6、页面分配策略、抖动、工作集