一起学Makefile(一)
make和makefile
makefile文件帮助我们记录了整个项目工程的所有需要编译的文件列表,这样我们在编译时仅需要输入简单的make命令就能编译出我们期望的结果。
makefile文件反映了整个项目中各个模块的依赖关系,这样我们改动了某些源文件以后,仅需简单的输入make命令,make工具就会根据makefile文件里描述的依赖关系帮助我们分析那些模块需要重新编译,并执行相应的操作。
在linux/unix开发环境中,makefile文件则是描述了一个特定编译系统所需要的策略,而make工具则是通过解析makefile文件并执行相应的命令来帮助我们构建其编译系统。
makefile简介
makefile就是一个简单的文本文件,它基本就是有一条条规则构造。
一条makefile的规则构成如下:
target:prerequisites
<tab> command1
<tab> command2
.....
<tab> command
target:规则的目标,可以简单理解为这条规则存在的目的是什么。通常是程序中间或者最后需要生成的文件名,也可以不对应具体的文件,而仅仅就是个概念上的规则目标。
prerequisites:规则的依赖列表,可以简单的理解为要达到本条规则的目标所需要的先决条件是什么。可以是文件名,也可以是其他规则的目标;
command:规则的命令,可以简单的理解为当目标所需要的先决条件的满足了之后,需要执行什么动作来达成规则的目标。规则的命令其实就是shell命令。一条规则中可以有多行命令,特别注意:每行命令都必须以tab键开始。
make工作原理
make命令如何使用?
make从哪里读取makefile?
mak如何解析执行makefile文件的规则?
make命令的基本使用范式如下:
make [ -f makefile ] [ options ] ... [ targets ] ...
使用make命令最简单的方式主要有以下四种方式:
1.简单粗暴,不带任何参数,直接指向make:
make
2.指定makefile文件
make –f <makefile_name>
3.指定makefile目标
make <target>
4.到指定目录下执行make
make –C <subdir> <target>
在执行make 的时候,我们可以带上 –f <文件名>参数,来指定make命令从哪里读取make文件;而如果我们不显示指定,则make就会在当前目录下依次查找名字为GNUmakefile,和Makefile,makefile的文件来作为其makefile文件。
在读取完makefile的内容后,make工具并不是逐条去执行makefile里的规则,而是以某条规则为突破口,多米诺骨牌效应式的去执行makefile里的规则。而这条作为突破口的规则的目标,称为终极目标 ,我们可以在执行make时以参数的形式指定终极目标,从而执行作为突破口的规则,如果我们不显式指定终极目标,make一般情况下将选择makefile的第一条规则的目标作为终极目标。
一般情况下,make执行一条规则的具体过程是这样的:
make解析makefile的流程如下:
假设makefile内容如下:
终极目标:依赖A
依赖B 依赖C
终极目标命令
依赖A:子依赖A1 子依赖A2
依赖A命令
依赖B:子依赖B1 子依赖B2
依赖B命令
依赖C:子依赖C1 子依赖C2
依赖C命令
过程一,以终极目标为树根,解析出整颗依赖树:
过程二,对整颗依赖树以从底到上,从左到右的顺序,解析执行每一条规则:
一起学Makefile(一)的更多相关文章
- 跟我学Makefile(三)
紧接着跟我学Makefile(二)继续学习:变量高级用法 (1)变量值的替换 :替换变量中的共有的部分,其格式是“$(var:a=b)”或是“${var:a=b}”,把变量“var”中所有以“a”字串 ...
- 一起学makefile
Unix.Linux必学知识哈哈,网上看到一哥们写得挺好挺详细的,直接复制地址就分享哈哈哈. 跟我一起写 Makefile(一) 概述 跟我一起写 Makefile(二) make是如何工作的 跟我一 ...
- 跟我学Makefile(七)
定义模式规则 使用模式规则来定义一个隐含规则.一个模式规则就好像一个一般的规则,只是在规则中,目标的定义需要有“%”字符.“%”的意思是表示一个或多个任意字符.在依赖目标中同样可以使用“%”,只是依赖 ...
- 跟我一起学Makefile
概述 什么是makefile?或许很多Winodws程序员都不知道这个东西,因为那些Windows IDE都为你做了这个工作,但我觉得要做一个好的和professional的程序员,makefile还 ...
- 跟我学Makefile(六)
shell 函数 :和反引号“`”是相同的功能 . shell 函数把执行操作系统命令后的输出作为函数返回. contents := $(shell cat foo) files := $(shell ...
- 跟我学Makefile(五)
文件名操作函数 每个函数的参数字符串都会被当做一个或是一系列的文件名来对待. $(dir <names...>) 名称:取目录函数——dir. 功能:从文件名序列<names> ...
- 跟我学Makefile(二)
命令出错: 每当命令运行完后, make 会检测每个命令的返回码,如果命令返回成功,那么 make 会执行下一条命令. 如果一个规则中的某个命令出错了(命令退出码非零),那么 make 就会终止执行当 ...
- 跟我学Makefile(一)
1.首先,把源文件编译生成中间代码文件,Windows下.obj文件,unix下.o文件,即Object File.这个动作叫编译(compile) 把大量的Object File合并执行文件,叫做链 ...
- 一起学Makefile(六)
命令的回显: 通常,make在执行命令之前都会把执行的命令进行输出,例如: 关闭命令回显有以下几种方式: 每个需要关闭回显的命令行之前加上”@”符号: 执行make时机上参数-s 或 –slient进 ...
- 一起学Makefile(五)
多目标规则 多目标规则,可以简单的理解为是一种将多条具有1)相同依赖和2)相同生成命令的规则,合并成一条规则的语法,其基本格式为: targets...: prerequisites... comma ...
随机推荐
- Java自学-I/O File类
Java 的File类,以及常用方法 文件和文件夹都是用File代表 步骤 1 : 创建一个文件对象 使用绝对路径或者相对路径创建File对象 package file; import java.io ...
- Python进阶----多表查询(内连,左连,右连), 子查询(in,带比较运算符)
Python进阶----多表查询(内连,左连,右连), 子查询(in,带比较运算符) 一丶多表查询 多表连接查询的应用场景: 连接是关系数据库模型的主要特点,也是区别于其他 ...
- CentOS7下载配置PostgreSQL的pgAgent运行代理作业
1.安装PostgreSQL 参考官方文档https://www.postgresql.org/download/linux/redhat/,运行如下命令 yum install https://do ...
- 很带劲,Android9.0可以在i.MX8开发板上这样跑
米尔MYD-JX8MX开发板移植了Android9.0操作系统,现阶段最高版本的Android9.0操作系统将给您的产品在安全与稳定性方面带来更大的提升.可惜了,这里不能上传视频在i.MX8开发板跑A ...
- 微信小程序生命周期详解
文章出处:https://blog.csdn.net/qq_29712995/article/details/79784222 在我看来小程序的生命周期虽然简单,但是他渗透了小程序开发的整个过程,对于 ...
- 使用Beef劫持客户端浏览器并进一步使用Beef+msf拿客户端shell
环境: 1.Kali(使用beef生成恶意代码,IP:192.168.114.140) 2.一台web服务器(留言板存在XSS跨站脚本漏洞,IP:192.168.114.204) 3. 客户端(用于访 ...
- linux网桥配置brctl
思路 将虚拟出一个bridge口,将对应的LAN都绑定在这个虚拟bridge口上,并给这个bridge口分配一个地址,其他子网微机配置网关为bridge口的地址便可以了 # brctl addbr b ...
- Win10系统配置Java环境变量
Win10系统配置Java环境变量 电脑重新装了个系统,又要重新配置JDK环境变量,这里做个记录. 安装JDK后在cmd里运行java会显示找不到指令,这种就是需要添加java的环境变量. 这里我记录 ...
- elasticsearch 分词后聚合
es 对于text类型其实是分词存储的,但是有时候在聚合的时候,会发现这种情况下,会把字段分词后进行聚合.例如(1)A,B (2)B,C 然后聚合后B就是2个,A和C各一个. 这需要看业务需求了 ...
- Socket网络编程-TCP编程
Socket网络编程-TCP编程 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.socket介绍 1>.TCP/IP协议 2>.跨网络的主机间通讯 在建立通信连接的 ...