第15课 - make的隐式规则(上)
第15课 - make的隐式规则(上)
1. 问题
如果把同一个目标的命令拆分的写到不同地方,会发生什么?
执行make all
这个实验表明了:如果同一个目标的命令拆分的写到不同地方,那么 make 会覆盖之前的目标对应的命令,使用最新出现的目标对应的命令。
makefile 中出现同名目标时
— 依赖:
- 所有的依赖将合并在一起,成为目标的最终依赖
— 命令:
- 当多处出现同一目标的命令时,make 发出警告
- 所有之前定义的命令被最后定义的命令取代
注意:当使用 include 关键字包含其它文件时,需要确保被包含文件中的同名目标只有依赖,没有命令;否则,同名目标的命令将被覆盖!
target 的下一行,以 tab 开头,该行也会被当做一条空命令。
下面的示例代码就是当主makefile包含了其它makefile导致目标重名,引发了 bug。
2. 什么是隐式规则(built-in rules)?
(1)make 提供了一些常用的,例行的规则实现
(2)当相应目标的规则未提供时,make 尝试使用隐式规则
思考:下面的 makefile 能成功编译吗?为什么?
对应的源文件如下:
#include <stdio.h> extern void foo(); int main()
{
foo(); return ;
}
main.c
#include <stdio.h> void foo()
{
printf("void foo() : %s\n", "Hello World");
}
func.c
SRCS := $(wildcard *.c)
OBJS := $(SRCS:.c=.o) app.out : $(OBJS)
$(CC) -o $@ $^
$(RM) $^
@echo "Target ==> $@"
Makefile
执行 make app.out 成功得到 app.out 可执行程序。
这个 Makefile 中没有 .o 中间文件对应的规则也没有定义 CC 和 RM 变量,但是 make 成功执行并且生成了最终的 app.out 这个可执行程序。
这表明了 make 调用了隐式规则中的 cc -c -o xx.o xx.c 以及 CC 和 RM 变量。
修改上面的Makefile
SRCS := $(wildcard *.c)
OBJS := $(SRCS:.c=.o) # 这里将 cc 改为 gcc
CC := gcc app.out : $(OBJS)
$(CC) -o $@ $^
$(RM) $^
@echo "Target ==> $@" # 这里手动添加规则,进行验证
%.o : %.c
@echo "my rule"
$(CC) -c -o $@ $^
Makefile(修改)
执行 make app.out 后的输出,这就验证了之前的隐式规则。
3. 总结上面实验的隐式规则
(1)make 提供了生成目标文件的隐式规则
(2)隐式规则会使用预定义变量完成编译工作
make 中的 .VARIABLES 预定义变量中包含了 make 的其它预定义变量
echo "$(.VARIABLES)"
(3)改变预定义变量将部分改变隐式规则的行为
(4)当已经存在自定义规则时,不再使用隐式规则
注:本文整理于《狄泰12月提升计划》课程内容
狄泰QQ群:199546072
第15课 - make的隐式规则(上)的更多相关文章
- 第16课 - make的隐式规则(下)
第16课 - make的隐式规则(下) 1
- makefile如果没有符合的显式规则将会使用隐式规则
举例: 当前目录下有个Makefile和jello.c文件,其中有这样的规则jello.o:%.c %.h Makefile (静态模式规则),表明的含义为:要生成的jello.o目标依赖jello. ...
- 第十五篇 make中的隐式规则概述
前面我们讲到了makefile的依赖拆分的知识,现在可以引申出这样一个问题,如果同一个目标的不同命令拆分的写到不同地方会发生什么?下面我们给出程序和执行结果: 可见后面的命令会覆盖前面的命令, ...
- makefile的隐式规则
target := exe source_code = hello.c OBJS = $(source_code:.c=.o) $(target):$(OBJS) gcc $^ -o $@ clean ...
- 每天多一点(2016.12.04)》Javascript隐式转换
乱想 javascript为什么需要隐式转换?如果没有会出现什么情况? 找了一圈没有看到关于这个的讨论,只好自己研究了,可能不一定正确,自行辨知. 郁闷就是郁闷在好好的,为什么要搞个隐式转换,一般来讲 ...
- Javascript隐式转换
乱想 javascript为什么需要隐式转换?如果没有会出现什么情况? 找了一圈没有看到关于这个的讨论,只好自己研究了,可能不一定正确,自行辨知. 郁闷就是郁闷在好好的,为什么要搞个隐式转换,一般来讲 ...
- C++中的隐式转换和explicit
隐式转换 c++中的数据类型转换分为隐式转换和显示转换: 显示转换即使用static_cast等方法进行转换,相关内容请参考 <C++数据类型转换>: 隐式转换则是编译器完成的,如,boo ...
- 无法执行 varchar 值到 varchar 的隐式转换,原因是,由于排序规则冲突,该值的排序规则未经解析。
SELECT CONVERT(VARCHAR(100), 列名) FROM Table 提示错误: 无法执行 varchar 值到 varchar 的隐式转换,原因是,由于排序规则冲突,该值的排序规则 ...
- Android学习笔记_17_Intent匹配规则(隐式意图)
Android基本的设计理念是鼓励减少组件间的耦合,因此Android提供了Intent (意图) ,Intent提供了一种通用的消息系统,它允许在你的应用程序与其它的应用程序间传递Intent来执行 ...
随机推荐
- 运用sklearn进行主成分分析(PCA)代码实现
基于sklearn的主成分分析代码实现 一.前言及回顾 二.sklearn的PCA类介绍 三.分类结果区域可视化函数 四.10行代码完成葡萄酒数据集分类 五.完整代码 六.总结 基于sklearn的主 ...
- Storcli64 工具操作指南
1.1 介绍 storcli64可对LSIRAID卡基本操作进行管理,本文主要是对LSIRAID卡常使用到的命令进行介绍 1.2 基本语法 获取控制器号:storcli64 /call show al ...
- [noip2002] 产生数
题目描述 给出一个整数 n (n<1030)和 k 个变换规则 (k < 15) . 规则: 一位数可变换成另一个一位数: 规则的右部不能为零. 例如:n = 234 .有规则( k=2 ...
- 分析dubbo心跳检测机制
目的: 维持provider和consumer之间的长连接 实现: dubbo心跳时间heartbeat默认是60s,超过heartbeat时间没有收到消息,就发送心跳消息(provider,cons ...
- kolla快速集成openstack-ocata和opencontrail-4.0.1.0单节点
参考链接: kolla快速集成openstack-ocata和opencontrail-4.0.1.0单节点 https://github.com/Juniper/contrail-docker/wi ...
- HM16.0之帧内模式——xCheckRDCostIntra()函数
参考:https://blog.csdn.net/nb_vol_1/article/category/6179825/1? 1.源代码: Void TEncCu::xCheckRDCostIntra( ...
- 3个必备cookie实用方法
今天跟大家介绍一下三种cookie的使用方法,selenium提供了我们add_cookie()方法来跳过验证码直接登录的方法.我们现在以博客园登录为例,都知道现在博客园登录要拼图验证. 先在网页打开 ...
- 注册github时总卡在第一步无法验证的解决办法
从github官网可以看出问题所在,所以造成这一问题的极大可能就是浏览器的问题. 最简单的方法就是换手机浏览器进行注册
- Android开发禁止首次进入activity弹出软键盘,限制屏幕只能竖屏或者横屏展示
作者:程序员小冰,CSDN博客:http://blog.csdn.net/qq_21376985 只需在在Manifest.xml中设定activity的属性为: android:windowSoft ...
- mac下使用命令行安装、卸载ipa包、查看日志
mac下使用命令行安装.卸载ipa包.查看日志 https://www.cnblogs.com/lily1989/p/8383916.html