Makefile之静态模式(7)
静态模式
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)相关推荐
- Makefile3、书写规则(文件搜寻、伪目标、多目标、静态模式、自动生成依赖性)
第三部分.书写规则 规则包含两个部分,一个是依赖关系,一个是生成目标的方法.在 Makefile 中,规则的顺序是很重要的,因为,Makefile 中只应该有一个最终目标,其它的目标都是被这个目标所连 ...
- ****** 五十 ******、软设笔记【UML分析和意义】-类图、对象图、状态图、活动图、顺序图、协作图、构件图、部署图,动静态模式...
一.类图(Class Diagram) 描述一组类.接口.协作已经它们之间的图,用来显示系统中各个类的静态结构图. 类之间的关系(relationship) *依赖(dependency) *泛化(g ...
- PHP编译为静态库,makefile生成静态库和动态库
库是一种软件组件技术,库里面封装了数据和函数. 库的使用可以使程序模块化. Windows系统包括静态链接库(.lib文件)和动态链接库(.dll文件). Linux通常把库文件存放在/usr/lib ...
- 对 makefile 中 $*和静态模式规则结合的学习
上例子 LIBS=foo.k bar.k.PHONY : allall: $(LIBS)@echo final$(LIBS): %.k : text.g@echo $*text.g:echo text ...
- Makefile、多Makefile编译静态库、动态库、SRC实例总结
静态库生成及使用 calc.h #ifndef __MY_LIB_H__ #define __MY_LIB_H__ int add(int a, int b); #endif calc.c #incl ...
- Makefile生成 静态链接库万能模板(当前文件夹、递归全部文件夹编译成.a)
感谢:Makefile常用万能模板(包括静态链接库.动态链接库.可执行文件) https://www.bbsmax.com/A/Vx5MyvWv5N/ 单文件下makefile编译成静态 ###### ...
- linux解决make依赖关系,makefile 自动处理头文件的依赖关系
现在我们的Makefile写成这样: all: main main: main.o stack.o maze.o gcc $^ -o $@ main.o: main.h stack.h maze.h ...
- H3C 交换机配置静态聚合(trunk/access)模式
目标: H3C 交换机配置静态聚合(trunk/access)模式 硬件配置: 1.三层核心交换机:S7005e 2.二层交换机:S5120 v2 S7005e过程: 创建vlan(如果已经存在可跳过 ...
- 浅显易懂 Makefile 入门 (12)— Makefile 常见的错误信息
1. 常见的错误信息 make 执行过程中所产生错误并不都是致命的,特别是在命令行之前存在 -.或者 make 使用 -k 选项执行时. make 执行过程的致命错误都带有前缀字符串 ***.错误信息 ...
最新文章
- 为何云原生在吞噬世界 ?
- Node.js:Web模块、文件系统
- 关于YOLO算法的备忘
- 循环卷积和周期卷积的关系_基于单口RAM读写的卷积电路(下)
- Makefile中怎么使用Shell if判断
- 使用SafeViewFlipper避免ViewFlipper交替时Crash
- android企业手机安全软件开发,基于Android的手机安全管理软件的设计与实现毕业论文.doc...
- Maven中dependencyManagement的使用
- 英特尔第11代台式机处理器发布:或将是14nm最后的倔强
- linux英文包安装教程视频,Linux源码包安装过程讲解
- 51Nod-2149 字符串出现位置【水题】
- Win XP 精简版安装SQL Server
- proj4js 坐标转换
- 装linux双系统有什么好处,科学网—Windows和Linux双系统安装教程 - 戴劭勍的博文...
- 红光光浴可以加速血液循环,完全放松身体各个部位的肌肉
- 【ThreadPoolTaskExecutor】 SpringBoot 的线程池的使用
- Opencascade 开发 1章
- 回顾Vue2---②
- CVPR2019 Learning to Reduce Dual-level Discrepancy for Infrared-Visible Person Re-identification
- AAB 扶正!APK 将退出历史舞台
热门文章
- Linux学习笔记-使用gdb调试
- Qt工作笔记- 解决cc1plus.exe: error: out of memory allocating
- Qml学习笔记-Repeater的基本使用
- linux bash lsnrctl,[转]lsnrctl: command not found
- 在java中为什么_属性绑定到类型_方法绑定到对象_13. Java基础之类型信息(RTTI和反射)...
- excel 单元格求和大于某个数后返回列号_Excel最常用的几个函数,我都帮你整理好了!...
- android OEM unlocking分析
- linux c计算两个int相除求百分比的实现
- 图解Public,protected ,private和什么也不填的区别
- 操作系统之内存管理:6、页面分配策略、抖动、工作集