Linux实用程序——Make快速入门

2023-05-16

640?wx_fmt=jpeg

1. Make

make 是 linux 系统的实用程序。它用于管理对于大型程序的自动编译任务,自动决定程序某一部分需要重新编译,并发出编译指令。虽然,我们最常见于 C 语言程序的编译。但是,make 不限于某一特定语言,凡是可以通过 shell 命令来运行编译器的语言都可以使用 make 。除此之外,你甚至可以用 make 描述任何构建任务,这些任务中,文件需要在其依赖的文件发生变动后自动更新。

2. Makefile

在使用 make 之前,你必须在当前目录下添加一个 Makefile 文件,它描述了文件之间的依赖(输入输出)关系,并提供更新文件的 Shell 命令。Makefile 文件名可以是 Makefile 也可以是 makefile,推荐使用 Makefile。

2.1 构成

简单的 Makefile 文件由若干如下格式的规则(rule)组成:

target: prerequisites
        recipe

  • target : 通常是程序生成(输出)的一个或多个文件名,例如:可执行文件或目标文件;它也可以是要执行任务的名称,例如用于清理生成文件的 clean 任务。

  • prerequisites: 先决条件是用于生成 target 文件的输入文件或是完成 target 任务前需要先执行的任务 。一个 target 可以没有先决条件,也可以有一个或多个先决条件。

  • recipe: 中文翻译为菜谱,它是 make 用于生成 target 文件或完成 target 任务而执行一系列 shell 命令。这些命令可以放在同一行里,也可以每个命令占一行。值得注意的是,recipe 默认以制表符开头,而不是空格。

2.2 运行 make

在当前目录下创建一个 Makefile 文件, 命名为 Makefile 。将以下内容复制到新建的 Makefile 文件中。

注意:  recipe 默认是以制表符开头,不是空格。如果复制到文件是空格,需要手动将空格改成制表符,即按键盘 tab 键。

.PHONY: help clean mk

help :
  @echo "help info"

dist :
  @mkdir dist

clean :
  @rm -rf dist

.PHONY: help clean mk 用于告诉 make 指定 target 列表不是文件名。可以理解是纯粹的任务,而不生成文件。

在 Makefile 所在目录运行不带参数的 make 命令:

make

会启动 Makefile 文件中第一个 target ,本例是 help , make 将 Makefile 中第一个出现的 target 作为默认目标 。

要启动其他 target,需要在 make 命令后指定 target 名称。如下分别启动目标 dist 和 clean 。

make dist
make clean

2.3 扩展:对比 npm scripts

对于前端的同学,最熟悉的构建方式莫过于 npm package.json 中 scripts 构建命令。在不使用项目中安装的包的情况下,即项目目录下 node_modules 里的包,完全可以使用 Makefile 来完成一些构建任务,make 的优势在于更好管理相互依赖的构建任务。

3. 变量

make 中的变量本质是一种宏替换,用于简化和维护重复出现的字符串和字符串列表。既可以出现在目标,先决条件,也可以出现在“菜谱”的 shell 命令中;可以是命令本身,也可以是命令的选项,或者输入输出文件;甚至也可以出现在另一个变量的引用中(计算变量)。

3.1 定义变量

make 变量定义和 shell 变量的定义非常相似。不同的是 make 变量的名称可以是任何不包含 :, #,= 和空字符的字符序列,并且等号两边可以有空格(shell 定义变量的等号两个不允许出现空格)。

如下定义一个变量 objs ,用于表示 c 语言编译器输出的一系列目标文件。

objs = main.o model.o view.o controller.o

3.2 使用变量

make 变量支持和 shell 变量一样,在变量标识符前加美元符 $ 来引用,因此,如果在"菜谱"中使用 shell 变量,需要使用双美元符 $$ 作为前缀加以区分;但更推荐的使用方式是使用美元符后跟一对圆括号的方式,例如使用上文创建的变量 objs ,可以这样 $(objs)。

build: $(objs)
    cc -o app $(objs)

4. 函数

make 中的函数用于处理 Makefile 文件中的文本,例如:计算操作的文件列表,“菜谱”中使用的命令等。

4.1 函数调用

函数调用类似于变量引用,它可以出现在任何变量引用可以出现的地方。调用方式如下:

$(function arguments)

或者:

${function arguments}

其中,function 是函数名称,arguments 是函数的参数。函数名与参数之间用空格或制表符隔开,多个参数之间用逗号 , 隔开。

4.2 用于字符串替换和分析的函数

4.2.1 $(subst from,to,text)

在 text 上执行文本替换,将出现的所有 from 替换成 to 。

Makefile:

subst:
  @echo $(subst o,O,hello world)

make:

$ make subst
hellO wOrld

4.2.2 $(patsubst pattern,replacement,text)

在 text 中寻找空格分隔的单词,如果单词匹配 pattern , 就将匹配的单词替换成 replacement 。pattern 和 replacement 都可以包含通配符 %,匹配任意数量的任意字符。当 pattern 和replacement 同时包含通配符 %,则将 replacement 中 % 替换成与 pattern 中 % 匹配的文本。

Makefile:

patsubst:
  @echo $(patsubst %.c,%.o,hello.c.c world.c)

make:

$ make patsubst
hello.c.o world.o

4.2.3 $(strip string)

移除字符串 string 首尾空格,并且将字符串中的多个空格替换成一个空格。

Makefile:

strip:
  @echo $(strip    hello     world   !  )

make:

$ make strip
hello world !

4.2.4 $(sort list)

按英文字母表顺序对列表 list 中的单词进行排序,删除重复的单词。输出是由单个空格分隔的单词列表。

Makefile:

sort:
  @echo $(sort dog cat animal fox bear fox elephant)

make:

$ make sort
animal bear cat dog elephant fox

4.2.5 $(words text)

返回 text 中单词数量。

Makefile:

words:
  @echo $(words dog cat animal fox bear fox elephant)

make:

$ make words
7

4.2.6 $(word n,text)

返回 text 中第 n 个单词,n 从 1 开始计数。

Makefile:

animals = bear cat dog elephant fox
word:
  @echo $(word $(words $(animals)), $(animals))

make:

$ make word
fox

隐式规则

某些重新生成目标文件的方式非常常用。例如,使用 C 编译器 cc 从 .c 源文件编译生成 .o 目标文件。隐式规则将告诉 make 如何使用常用的技术,让你在使用时不必给出全部细节,简化书写。例如,make 为 C 语言编译提供一个隐式规则。文件名决定将应用哪个隐式规则。比如,C 编译通常输入 .c 文件,输出 .o 文件。因此,当看到文件名结尾符合这种组合时,make 将隐式规则应用于 C 编译。

Makefile:

app : main.o utils.o
  cc -o app main.o utils.o

main.o : main.c utils.h
  cc -c main.c

utils.o : utils.c
  cc -c utils.c

可以去掉编译命令,简写为:

app : main.o utils.o
  cc -o app main.o utils.o

main.o : main.c utils.h

utils.o : utils.c

make:

$ make
cc    -c -o main.o main.c
cc    -c -o utils.o utils.c
cc -o app main.o utils.o

640?

640?wx_fmt=gif

免责声明:本文系网络转载,版权归原作者所有。如涉及作品版权问题,请与我们联系,我们将根据您提供的版权证明材料确认版权并支付稿酬或者删除内容。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux实用程序——Make快速入门 的相关文章

  • matlab中m文件的命名规则

    matlab的m文件的命名规则 xff1a 1 文件名命名要用英文字符 xff0c 首字符不能是数字或下划线 xff1b 2 文件名不能与matlab的内部函数名相同 m文件名的命名尽量不要是简单的英文单词 xff0c 最好是由大小写英文
  • 2014去哪儿校招笔试

    共 3 43 2 43 2 个题 开发 前3 个必做 xff0c 其他选做 测试或web 开发 前 2 个必做 43 另外 2 个必做 1 字符串split 43 翻转 2 实现 访问历史记录 xff0c insert next pre 3
  • MicroStrategy笔试

    1 coding判定二叉树是否是有序二叉树 2 一个有序数组A xff08 buffer 足够大 xff09 xff0c 和一个有序数组 B xff0c 设计算法 xff0c merge 两个数组后有序 xff0c 不使用任何额外的内存空间
  • 欢迎使用CSDN-markdown编辑器

    能力培养 与team leader讨论 xff0c 大抵将能力培养分成三类 业务能力 解决具体反馈的问题 xff1b 总结通用的解决方案 xff1b 从根本上改善根本问题技术能力 设计架构的能力 xff0c 注重性能的改善泛化能力 明确问题
  • 一些5G整理

    鲁棒性 设计 相对于终端成本 xff0c 网络掉线的损失是行业客户是不可接受的 xff0c 所以行业终端鲁棒性设计很重要 这里的鲁棒性是指排除了前述的散热 环境可靠性等自身设计后面对其他突发未知情况的还能可靠应用的能力 业内对于鲁棒性的设计
  • ES设置多个自定义分词器,每个分词器使用不同的词库

    ES中如何设置自定义分词器并且每个分词器使用自己定义的词库 xff1f 1 首先在ansj cfg yml中配置 然后在ansj library properties文件中添加词典放置路径 ansj library properties和l
  • 开发原则

    1 提供完整的数据 xff0c 不需要调用者进行额外的处理 2 测试 xff0c 保证比较对象要都是真实正确的 3 以业务需求为驱动 xff0c 兼顾系统架构升级
  • Windows下多台电脑共享剪切板的方法

    转自于 http www microsoft com china MSDN library WebServices WebServices WebServices mspx mfr 61 true
  • Cisco Packet Tracer模拟器使用

    第一篇 熟悉界面 一 设备的选择与连接 在界面的左下角一块区域 xff0c 这里有许多种类的硬件设备 xff0c 从左至右 xff0c 从上到下依次为路由器 交换机 集线器 无线设备 设备之间的连线 xff08 Connections xf
  • 各种路由器接口与连接方法

    转自于 http bbs pcsoft com cn thread 138952 1 4 html 路由器所在的网络位置比较复杂 xff0c 既可是内部子网边缘 xff0c 也可位于内 外部网络边缘 同时为了实现强大的适用性 xff0c 它
  • line vty 0 4 什么意思

    转自于 http hi baidu com rxlly blog item 9072bc397ae18bde7c1e71f6 html line vty 0 4是不是指启用5个telnet会话的意思 xff1f 那line vty 0 0是
  • matlab实现牛顿迭代法求解非线性方程组

    http hi baidu com aillieo blog item 0800e2a10ac9a59647106493 html 已知非线性方程组如下 3 x1 cos x2 x3 1 2 61 0 x1 2 81 x2 43 0 1 2
  • 区别 chown和chmod的用法

    本人总是习惯使用chmod xff0c 而把chown混淆 chown就是修改 第一列内容的 xff0c chmod是修改 第3 4列内容的 chown用法 用来更改某个目录或文件的用户名和用户组的 chown 用户名 组名 文件路径 xf
  • Linux中安装新的包时错误提示

    错误1 E Could not open lock file var lib dpkg lock open 13 Permission denied E Unable to lock the administration directory
  • django框架简介

    主要内容 1 Django框架发展 2 Django架构 MTV模式 3 开发流程 4 开发实例 Poll python下各种框架 一个完整的Web应用框架包括下面功能的支持 服务发布 URL分发 模板支持 数据库处理 Python框架一般
  • 用VirtualBox打开VMware创建的虚拟机的方法

    方法一 xff1a 用VMware7 0以上版本 xff0c 自带的 ovftool exe 工具将 vmx 文件转化成 ovf 文件 命令格式 xff1a ovftool vmx文件完整路径 要存放ovf 文件的路径 注意 xff1a 源
  • 松灵学院 | 在松灵 LIMO 上使用 Docker 进行 ROS2 开发

    截至目前 xff0c Jetson Nano 平台官方仍不提供 Ubuntu 20 04 固件 xff0c 所以使用 Jetson Nano 平台开发 ROS2 存在巨大的困难 xff0c 但是好在 Docker 提供的容器技术 xff0c
  • 2019学习计划

    1 数据结构与算法 2 架构设计
  • ORB-SLAM(1) --- 让程序飞起来

    1 ORB SLAM简介 ORBSLAM是15年出的比较完备的单目slam算法 xff0c orb指的是一种旋转不变性特征 xff0c 整个算法均是基于orb特征实现的 xff0c 不同于基于稠密或半稠密地图的slam orbslam是一个
  • 再论文件系统

    2012 03 21 19 58 分类 xff1a File System 概述 关于 Linux 首先我们要了解的是其分区管理模式 xff0c 与 Windows 不同的是 Linux 是一个树形的目录结构 xff0c 无论怎么分区 xf

随机推荐

  • httpd服务器Failed to start httpd.service: Unit httpd.service is masked.解决办法

    当我们启动httpd服务的时候 xff0c 系统报错为 Failed to start httpd service Unit httpd service is masked 解决方法 xff1a systemctl unmask httpd
  • Python Pandas面试题及答案

    Pandas是一个开源库 xff0c 可在Python中提供高性能的数据处理 Pandas这个名称源自 面板数据 一词 xff0c 这表示来自多维数据的计量经济学 它可用于Python中的数据分析 xff0c 并由Wes McKinney在
  • podman简介

    podman简介掌握docker 跟上云时代的步伐 Podman是一个开源项目 xff0c 可在大多数Linux平台上使用并开源在GitHub上 Podman是一个无守护进程的容器引擎 xff0c 用于在Linux系统上开发 xff0c 管
  • 运维工程师从月薪 5K 到 50K,中间都经历了什么?

    做 运维 感觉像网管怎么办 xff1f 新工作运维3个多月 xff0c 天天就是维护重启服务器 xff0c 更新代码 感觉这样下去几年后就没有什么竞争力了 这是一个热门运维问题 xff0c 也是很多刚进入运维工作的同学面临的心境 确实 xf
  • Python初学者的自我修养,找到自己的方向

    Python初学者的自我修养 xff0c 找到自己的方向 对于我来说Python的应用场景主要是机器学习 深度学习相关 xff0c 对于其他的场景涉猎不多 因此本文的目的并不是列举出一系列小项目给你们练手 xff0c 而是希望引导大家思考这
  • 这100个shell脚本案例,你都知道吗?一篇教会你写90%的shell脚本

    shell 是一个应用程序 xff0c 它连接了用户和 Linux 内核 xff0c 让用户能够更加高效 安全 低成本地使用 Linux 内核 xff0c 这就是 Shell 的本质 shell脚本就是由Shell命令组成的执行文件 xff
  • 掌握它=掌握k8s!Kubernetes中文文档,学习提升看这一篇就足够

    Kubernetes又称 xff08 k8s xff09 xff0c 这几年可谓是非常的火热 xff0c Kubernetes让部署容器化的应用简单并且高效 xff0c 越来越多的程序员都想学习和掌握它来提高自己的效率 先来了解一下它的背景
  • Adaptive Autosar 整体架构理解

    1 总体说明 xff08 图片来源主要来源于Simulink 以及 Vector xff09 在Autosar官网 xff08 autosar org xff09 上 xff0c 目前CLASSIC PLATFORM 更新到4 4版本 xf
  • 244页Prometheus操作指南,内容详尽讲解细致

    Prometheus在监控工具中有多少话语权 xff1f 作为一款开源的监控工具 xff0c 早早地就在云原生计算基金会中毕业了 xff0c 如今已经成为了云原生应用的首选监控工具 xff0c 在国内外被广泛应用 Prometheus俨然已
  • 在 Linux 终端上的 10 个有趣的命令

    Linux 的命令行不仅是一个复杂且强大的命令所在地 xff0c 同时也是一个有趣的乐园 在本文中 xff0c 我整理了一系列有趣的 Linux 命令 xff0c 您可以从中获得乐趣 1 cmatrix 本列表中的第一个必须是 cmatri
  • 80篇+网络安全面试经验帖

    网络安全面试经验80篇 43 xff0c 看完妈妈再也不用担心我面试的问题了 汇总以下安全服务岗的面经 xff1a 渗透测试 红队攻防 代码审计 安全研究 红队开发 主要由两部分组成 xff1a 个人面试 互联网收纳整理 一 我的实习 am
  • Bash 中的 ${} 和 $() 有什么区别

    像 Linux 这样的基于 GNU 的操作系统依赖于一个名为 Bash 的命令语言解释器或 Shell 来完成它们的大部分计算任务和目标 Bash 是 Bourne Again Shell 的缩写 xff0c Bunne Again She
  • Go 服务端开发,请牢记这几条

    服务端开发一般是指业务的接口编写 xff0c 对大部分系统来说 xff0c 接口中CURD的操作占了绝大部分 然而 xff0c 网络上总有调侃 CURD工程师 的梗 xff0c 以说明此类开发技术并不复杂 但我个人认为 xff0c 如果仅仅
  • 域格4G模块串口开机自动透传的使用

    首先要求是模块版本为串口自动透传版本 1 模式切换 从透传模式切换至临时指令模式的时序 xff1a 1 串口设备给模块 连续发送 43 43 43 xff0c 模块收到 43 43 43 后 xff0c 会给串口设备发送一个 a 在发送 4
  • 网红送餐无人车冒充AI,真人海外远程操控

    美国网红外卖机器人Kiwibot实际由远在南美哥伦比亚的真人远程操控 xff0c 每人时薪不到2美元 xff0c 最多控制三台 2017年成立的Kiwi Campus公司累计获得200万美元融资 xff0c 约人民币1414万元 xff0c
  • 国产开源基础软件MiniGUI宣布支持RT-Thread!

    北京飞漫软件技术有限公司宣布 xff1a 将在 MiniGUI 4 0 2 版本中支持国产操作系统 RT Thread xff01 这是自 MiniGUI 创始人魏永明在本月初宣布启动 1998 年年底 xff0c 魏永明开始在清华大学开发
  • 既然C编译器是C语言写的,那第一个C编译器是怎样来的?

    来源 xff1a 伯乐在线 xff0c 作者 xff1a Chaobs 首先向C语言之父Dennis Ritchie致敬 xff01 当今几乎所有的实用的编译器 解释器 xff08 以下统称编译器 xff09 都是用C语言编写的 xff0c
  • Oracle推出全球首个自治操作系统~

    原创 xff1a 程序员的那些事 xff08 id xff1a iProgrammer xff09 导读 xff1a 保持系统的修补和安全是 IT 部门目前面临的最大挑战之一 在大规模云环境中 xff0c 此类任务乏味 容易出错 xff0c
  • 基于Autosar的网络安全理解

    目录 1 车载网络安全说明 2 常用的安全加密算法 2 1 对称加密 2 2 非对称加密 2 3 混合加密 2 4 单向散列函数 2 5 消息认证码 2 6 数字签名 3 Autosar的加密模块 3 1 模块说明 3 2 关键数据流说明
  • Linux实用程序——Make快速入门

    1 Make make 是 linux 系统的实用程序 它用于管理对于大型程序的自动编译任务 xff0c 自动决定程序某一部分需要重新编译 xff0c 并发出编译指令 虽然 xff0c 我们最常见于 C 语言程序的编译 但是 xff0c m