【Makefile】2-Makefile的介绍及原理
前言
- 本笔记主要记录Makefile一些概念要点。
- 本笔记为提取性笔记,章节与《跟我一起写Makefile》同步,所以会看到有些小标题会跳过。
概念
Chapter 2:介绍
2.1 makefile的规则
target ... : prerequisites ...
command
...
...
target
- 可以是一个object file(目标文件)
- 也可以是一个执行文件
- 还可以是一个标签(label)。
prerequisites
- 生成该 target 所依赖的文件 和 / 或 targe。
command
- 为该 target 要执行的命令(任意的shell命令)。
注:prerequisites 中如果有一个以上的文件比 target 文件要新的话,command 所定义的命令就会被执行。
2.3 make 是如何工作的 **
在默认的方式下,也就是我们只输入 make 命令,就会按下面流程走
- make会在当前目录下找名字叫 Makefile 或 makefile 的文件。
- GNU make找寻默认的Makefile的规则是在当前目录下依次找三个文件—— GNU-makefile 、 makefile 和 Makefile。
- 如果找到,它会找文件中的第一个目标文件(target),在上面的例子中,他会找到edit这个文件,并把这个文件作为最终的目标文件。
- 注:此处的 "edit" 是第一个目标,例子就不贴出来了。
- 如果 edit 文件不存在,或是edit所依赖的后面的.o文件的文件修改时间要比 edit 这个文件新,那么,他就会执行后面所定义的命令来生成 edit 这个文件。
- 如果 edit 所依赖的.o文件也不存在,那么 make 会在当前文件中找目标为.o文件的依赖性,如果找到则再根据那一个规则生成.o文件。(这有点像一个堆栈的过程)
- 当然,你的 C 文件和 H 文件是存在的啦,于是 make 会生成.o文件,然后再用.o文件生成make的终极任务,也就是执行文件 edit 了。
2.5 让 make 自动推导
该功能了解一下。
只要make看到一个.o文件,它就会自动地把.c文件加在依赖关系中,如果make找到一个whatever.o,那么whatever.c就会是whatever.o的依赖文件。并且cc -c whatever.c也会被推导出来。
如:
whatever.o : whatever.h
# 等价于
whatever.o : whatever.c whatever.h
cc -c whatever.c
2.8 Makefile 里面有什么
Makefile 里主要包含了五个东西:
* 显式规则
* 隐晦规则
* 变量定义
* 文件指示
* 注释
- 注:还值得一提的是,在Makefile中的命令,必须要以Tab键开始。
以上几点详细解释参考《跟我一起写Maefile》对于章节
2.9 Makefile 的文件名
- 默认情况下,make命令会在当前目录下按顺序找寻文件名为 GNUmakefile、makefile、Makefile的文件。
- 推荐使用 Makefile 命名。
- 也可以使用别名命名,如 Makefile.build、abcde等等,只需要使用 make -f 文件名 或 make -file 文件名 来指定文件名即可。
2.10 引用其它的Makefile
- 在 Makefile 使用 include 关键字可以把别的 Makefile 包含进来,这很像 C 语言的 #include ,被 包含的文件会原模原样的放在当前文件的包含位置。
- include 语法:
- filename 可以是当前操作系统 Shell 的文件模式(可以包含路径、通配符和多个文件)(多个文件时用空格隔开)。
include <filename>
寻找其它的 Makefile 路径及顺序
- 先在 filename 指定路径找。如:include <./Makefile.build> ,表示在当前路径先找。
- 如果 filename 没有指定路径的话,就先从 make 当前路径先找。
- 以上两个都没有,便开始找 make时 -I 或 --include-dir 指定路径找。
- 还没找到便去目录 /include (一般是:/usr/local/bin 或 /usr/include)找。
- 都没有便发出警告。(若想略过警告,可以使用 - 号,-include )
- 总结一下:filename指定路径->当前路径->-I或--include-dir 指定路径->最后路径。
2.11 环境变量 MAKEFILES
不建议使用 MAKEFILE 变量。需要了解,可以看文档。
**若使用Makefile时,出现了神奇的 bug ,可以先看看当前环境变量中有没有定义这个变量。
2.12 make 的工作方式
GNU 的 make 工作时的执行步骤如下:
- 读入所有的 Makefile。
- 读入被 include 的其它 Makefile。
- 初始化文件中的变量。
- 推导隐晦规则,并分析所有规则。
- 为所有的目标文件创建依赖关系链。
- 根据依赖关系,决定哪些目标要重新生成。
- 执行生成命令。
参考
书籍
- 《GUN Makefile》
- 《跟我一起写Makefile》
【Makefile】2-Makefile的介绍及原理的更多相关文章
- Configure,Makefile.am, Makefile.in, Makefile文件
一 软件安装关于 makefile文件问题 如果拿到的工程文件中,没有Makefile文件,而只有configure.in和Makefile.am文件,我们是不能够直接进行编译的,必须根据config ...
- make 查找的文件名顺序为:“GNUmakefile”、“makefile”、“Makefile”
默认的情况下,make会在工作目录(执行make的目录)下按照文件名顺序寻找makefile文件读取并执行,查找的文件名顺序为:“GNUmakefile”.“makefile”.“Makefile”. ...
- 转载:AbstractQueuedSynchronizer的介绍和原理分析
简介 提供了一个基于FIFO队列,可以用于构建锁或者其他相关同步装置的基础框架.该同步器(以下简称同步器)利用了一个int来表示状态,期望它能够成为实现大部分同步需求的基础.使用的方法是继承,子类通过 ...
- Makefile第三讲:终端传值给Makefile、Makefile传值给C++代码
摘要 终端传值给Makefile,咋传?只需在终端输入以下命令,那么就可以在Makefile文件中放心大担的使用$(abcde)这个变量了,它的值为BBB Makefile fun.h #includ ...
- AbstractQueuedSynchronizer的介绍和原理分析(转)
简介 提供了一个基于FIFO队列,可以用于构建锁或者其他相关同步装置的基础框架.该同步器(以下简称同步器)利用了一个int来表示状态,期望它能够成为实现大部分同步需求的基础.使用的方法是继承,子类通过 ...
- CGLIB介绍与原理
转载: http://blog.csdn.net/zghwaicsdn/article/details/50957474 CGLIB介绍与原理(部分节选自网络) 一.什么是CGLIB? CGLIB是一 ...
- Servlet过滤器介绍之原理分析
zhangjunhd 的BLOG 写留言去学院学习发消息 加友情链接进家园 加好友 博客统计信息 51CTO博客之星 用户名:zhangjunhd 文章数:110 评论数:858 访问量:19 ...
- Makefile.am, Makefile.in 与 Makefile的关系(转)
文章出处:http://blog.mcuol.com/User/wangguangdong/Article/17384_1.htm Makefile.am, Makefile.in, Makefile ...
- Hadoop数据管理介绍及原理分析
Hadoop数据管理介绍及原理分析 最近2014大数据会议正如火如荼的进行着,Hadoop之父Doug Cutting也被邀参加,我有幸听了他的演讲并获得亲笔签名书一本,发现他竟然是左手写字,当然这个 ...
随机推荐
- involution 内卷化
involution 内卷化 虽然不熟悉 involution,但是我想起另外两个常用词:evolution(进化)和 revolution(革命). 它们共同的词根volute,拉丁语原意是&quo ...
- Tailwind CSS in Action
Tailwind CSS in Action Tailwind CSS是一个高度可定制的低级CSS框架,它为您提供了构建定制设计所需的所有构造块,而无需烦恼要覆盖的烦人的自以为是的样式 https:/ ...
- js 获取包含emoji的字符串的长度
let emoji_exp = /(\u00a9|\u00ae|[\u2000-\u3300]|\ud83c[\ud000-\udfff]|\ud83d[\ud000-\udfff]|\ud83e[\ ...
- RocketMq灰皮书(二)------本地部署启动MQ
RocketMq灰皮书(二)------本地部署启动MQ Windows10本地部署RocketMQ 在上一篇文章中,我们对rocket的几个基本概念进行了介绍,也了解了业内几大消息中间件的区别.在本 ...
- hadoop支持lzo完整过程
简介 启用lzo 启用lzo的压缩方式对于小规模集群是很有用处,压缩比率大概能降到原始日志大小的1/3.同时解压缩的速度也比较快. 安装lzo lzo并不是linux系统原生支持,所以需要下载安装软件 ...
- MVVM中的vm双向监听和mvc的缺点
`MVVM`模型: - 即Model,模型,包括数据和一些基本操作 - 即View,视图,页面渲染结果- 即View-Model,模型与视图间的双向操作(无需开发人员干涉) `MVVM`中的`VM`要 ...
- springboot项目打包成jar包在Linux服务器默认80端口运行
springboot项目端口设置 在application.properties文件 server.port=80 在application.yml文件 server: port: 80 然后在ide ...
- 若依管理系统RuoYi-Vue(三):代码生成器原理和实战
历史文章 若依管理系统RuoYi-Vue(一):项目启动和菜单创建 若依管理系统RuoYi-Vue(二):权限系统设计详解 本篇文章将会讲解ruoyi-vue系统下代码生成器的使用.原理分析以及将这部 ...
- Hi3559AV100-自己编译了u-boot、kernel及rootfs后,出现烧写错误或者烧写后板载无法启动的解决思路
这篇随笔主要给出了Hi3559AV100-自己编译了u-boot.kernel及rootfs后,出现烧写错误或者烧写后板载无法启动的解决思路. 问题 (1)对于 u-boot 为官方的,kernel ...
- 使用windbg定位内存问题【入门级】
1. 背景 在开发过程中,我们可能遇到应用程序线程占用过大的问题,可以通过windbg命令去定位哪些类型,哪些内存一直占用堆资源,从而查出问题,解决问题. 2. 准备工作 工具: 抓取DUMP文件的工 ...