makefile快速入门(精简版)

WHAT

  Makefile 是一种文本文件,由一系列规则(Rules)组成,每个规则描述了一个或多个目标(Target)和相应的依赖关系(Dependencies),以及构建目标所需的命令(Commands)。
  以下是最简单的规则示例:

targets: dependenciescommandcommandcommand

  target:目标的名称,通常一个规则只有一个目标;
  dependencies: 目标所依赖的文件或操作,通常用空格隔开;
  command:构建目标所需的命令(注意,这里必须用tab缩进,不能用空格)。

WHY

  1. 自动化构建:Makefile可以自动化执行构建过程,包括编译源代码、链接库文件、生成可执行文件等。通过定义规则和依赖关系,Makefile 可以根据文件的修改时间和依赖关系来确定需要重新构建的文件,从而减少手动操作和避免不必要的重复编译。
  2. 跨平台支持:Makefile 是一种与平台无关的构建工具,可以在不同的操作系统上使用,包括 Linux、Unix、macOS 等。
  3. 灵活性和可扩展性:Makefile 提供了丰富的语法和功能,允许开发人员定义变量、条件语句、循环等,以实现更复杂的构建逻辑。
  4. 组织和管理依赖关系:Makefile 可以清晰地定义目标和依赖关系,当某个文件或模块发生变化时,Makefile 可以自动识别需要重新构建的目标,并自动更新相关的文件。
  5. 构建多个目标:Makefile 支持定义多个目标和规则,可以同时构建多个目标,提高构建效率。这对于大型项目或具有多个模块的项目特别有用。

HOW

  1. 理解目标和依赖关系:目标是需要构建的文件或操作的名称,依赖关系指定了目标所依赖的文件或操作。在 Makefile 中,目标和依赖关系通常以文件名的形式表示。
  2. 了解常用的内置变量:在 Makefile 中,可以使用内置变量来简化和控制构建过程,例如指定编译器、链接器、目标文件等,以下是常见的内置变量。
    注意:内置变量的命名通常使用大写字母,并使用括号 $(…) 进行引用
变量名
含义
$(CC)C 编译器的名称,默认为 cc
$(CXX)C++ 编译器的名称,默认为 g++
$(AR)静态库归档工具的名称,默认为 ar
$(LD)链接器的名称,默认为 $(CC)
$(RM)删除文件的命令,默认为 rm -f
$(MAKE)Make 工具的名称,默认为 make
$(MAKECMDGOALS)包含了命令行上指定的目标列表
$(MAKEFILE_LIST)当前 Makefile 的文件名列表
$(CURDIR)当前工作目录的绝对路径
$(PWD)当前工作目录的绝对路径(与 $(CURDIR) 相同)
$(SHELL)Shell 程序的名称,默认为 /bin/sh
$(MAKE_VERSION)Make 工具的版本号
  1. 理解变量的使用:Makefile 中可以定义变量来存储和传递值。
      自定义变量:除了使用内置变量外,可以根据需要定义自己的变量,用于存储特定的值、路径、文件列表等。自定义变量的命名通常使用大写字母和下划线分隔单词,以提高可读性。
赋值形式
含义
举例
=延迟展开(在使用这个变量时,其右侧的表达式才会被解析)VAR = value
TARGET = $(VAR)
VAR = new_value
  在这个例子中,TARGET 的值将会是 new_value,因为在赋值时 $(VAR) 被设置为 value,但后来 VAR 的值又被重新赋为 new_value。
:=立即展开(在赋值时就会对右侧的表达式进行解析)VAR := value
TARGET := $(VAR)
VAR := new_value
  在这里,TARGET 的值将会是 value,因为在赋值时 $(VAR) 的值已经是 value,后续对 VAR 的修改不会影响 TARGET。
?=条件赋值(仅当变量未被赋值时才会赋值)VAR ?= value
  如果 VAR 已经有了值,比如通过命令行传递了参数,那么它将保留该值,否则会被设置为 value。
+=追加值(在原有值的末尾添加新的值)VAR += new_value
  如果 VAR 已经有值,那么 new_value 将会被追加到其末尾;如果 VAR 没有值,则相当于使用 VAR = new_value。
  1. 学习常用的命令:Makefile 中的命令用于执行构建操作。命令通常以制表符开头,并且在同一行中。命令可以是任何有效的 Shell 命令。
命令
作用
echo text打印文本到标准输出
cd directory切换当前工作目录到指定目录
mkdir directory创建新的目录
rm file删除文件
cp source destination复制文件或目录
  1. 了解常用的内置函数:内置函数用于在 Makefile 中执行各种操作和处理文本。它们可以帮助实现复杂的构建逻辑、文件操作和任务执行。
函数名
含义
$(shell command)执行命令并返回其输出结果
$(wildcard pattern)匹配指定模式的文件列表
$(foreach var, list, text)对列表中的每个元素执行指定操作
$(if condition, then-part, else-part)根据条件选择执行不同的操作
$(subst from, to, text)将文本中的指定字符串替换为另一个字符串
  1. 阅读 Makefile 的注释:Makefile 中的注释以 # 开头,可以提供对规则和命令的解释和说明。
  2. 实践和尝试:通过阅读和分析现有的 Makefile,并尝试自己编写简单的 Makefile,来加深对 Makefile 的理解和熟悉。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/582133.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【K8S 二进制部署】部署单Master Kurbernetes集群

目录 一、基本架构和系统初始化 1、集群架构: 2、操作系统初始化配置: 2.1、关闭防火墙和安全机制: 2.2、关闭swap 2.3、根据规划设置主机名 2.4、三台主机全部互相映射 2.5、调整内核参数 3、时间同步(所有节点时间必须同…

Linux系列之不解压直接查看gzip压缩日志

Linux系列之不解压直接查看gzip压缩日志文件 在Linux服务器上,日志文件经常会用gzip格式进行压缩,以节省磁盘,对于这种压缩文件,需要解压?然后再用cat、grep这些命令进行查看?其实不需要,Linux…

Vue解决跨域问错误:has been blocked by CORS policy 后端跨域配置

解决跨域问题后端跨域配置代码: /*** 作者 hua* 描述 跨域配置*/ Configuration public class WebConfiguration implements WebMvcConfigurer {/*** 跨域配置对象* return CorsConfiguration对象*/private CorsConfiguration corsConfig() {CorsConfiguration cor…

考研结束,以下事情要抓紧做了!

Hello,大家好,我是 Sunday。 首先恭喜大家考研结束,也在这里祝各位考研的同学们可以 成功上岸 ✿✿ヽ(▽)ノ✿。 不过,考试结束并不是一个终点,而是另外一个新的起点。摆在大家面前的,还有很多新的问题&a…

百度CTO王海峰:飞桨开发者已达1070万

目录 写在前面 飞桨开发者已达1070万 文心一言用户规模破亿,日提问量快速增长 写在前面 “文心一言用户规模突破1亿。”12月28日,百度首席技术官、深度学习技术及应用国家工程研究中心主任王海峰在第十届WAVE SUMMIT深度学习开发者大会上宣布。会上&…

北航人机交互复习

人机交互 根据学过的内容,说明我们为什么要研究人机交互 人机交互需求推动:追求高效、安全、舒适、准确人机交互产业推动:相关产业发展,技术发展使幻想变为可能,譬如,苹果人机交互界面开发技术推动&#…

面试算法76:数组中第k大的数字

题目 请从一个乱序数组中找出第k大的数字。例如,数组[3,1,2,4,5,5,6]中第3大的数字是5。 分析 面试题59中介绍过一种基于最小堆的解法。这种解法的数据位于一个数据流中,不能一次…

【AIGC_MIDJOURNEY】专业提示词+配图分析

prompt : landscape of beautiful forest, lush foliage and water falls, crystal clear lake, fire flies, twinkling lights , rococo, art nouveau, --ar 16:9 这个提示词描述了一个美丽的森林景观,包括茂密的植被和瀑布,清澈见底的湖泊,…

干货!一文详解车间管理的五大基本方法

车间管理是制造型企业生产过程中的重要环节,它直接影响着企业的生产效率、成本控制、产品质量以及员工的士气与工作效率。优秀的车间管理不仅能够提升产品的质量和生产力,还能降低运营成本,从而在激烈的市场竞争中为企业赢得优势。 为了帮助…

Java 通过 filter 过滤器对请求参数进行处理并修改

通过 filter 过滤器对请求参数进行处理并修改 问题描述:解决方案1、重写 HttpServletRequestWrapper 类2、新增过滤器 问题描述: 通过过滤器,对前端请求过来的参数进行处理(本次是对请求参数进行前后空格的去除)&…

vue3-13

token可以是后端api的访问依据,一般绝大多数时候,前端要访问后端的api,后端都要求前端请求需要携带一个有效的token,这个token用于用户的身份校验,通过了校验,后端才会向前端返回数据,进行相应的操作,如果没…

Linux的LVM与磁盘配额

一.LVM 1.什么是LVM Logical Volume Manager 逻辑卷管理 能够在保持现有数据不变的情况下,动态调整磁盘容量,从而提高磁盘管理的灵活性 /boot 分区用于存放引导文件,不能基于LVM创建 解释:就是将多个不同的物理卷组合在一起形…

C++设计模式代码--单例模式

参考:5. 单例模式(Singleton) (yuque.com) 1、什么是单例模式 保证一个类只有一个实例,并提供一个访问该实例的全局节点; 2、什么情况下需要单例模式 某个类的对象在软件运行之初就创建,并且在软件的很…

Python高级用法:迭代器(iter)

迭代器 迭代器是一个实现了迭代器协议的容器对象。它基于以下两个方法。 __ next __:返回容器的下一个元素。 __ iter __:返回迭代器本身 迭代器可以利用内置的iter函数和一个序列来创建, 假设我们的序列为[1, 2, 3],迭代器创建过程如下: i…

读取无标题列表txt文本文件

文件如下: 使用pandas直接读取,有多少条数据,就会读出来多少列: import pandas as pdfilepath/Users/。。。/ file1失败名单.txt df1pd.read_csv(filepathfile1,sep,,headerNone) 会打印出无数列数据: 使用open方法读…

3. SQL - 查询

1.SQL-单表查询 1.1 DQL准备工作 #创建商品表: create table product( pid int primary key, pname varchar(20), price double, category_id varchar(32) ); INSERT INTO product(pid,pname,price,category_id) VALUES(1,联想,5000,c001); INSERT INTO product(pid,pname,p…

31.Java程序设计-基于Springboot的鲜花商城系统的设计与实现

引言 背景介绍:鲜花商城系统的兴起和发展。研究目的:设计并实现一个基于Spring Boot的鲜花商城系统。论文结构概述。 文献综述 回顾相关鲜花商城系统的设计与实现。分析不同系统的优缺点。强调Spring Boot在系统设计中的优越性。 系统设计 需求分析 用户…

本地缓存Caffeine的使用

1 依赖 <dependency><groupId>com.github.ben-manes.caffeine</groupId><artifactId>caffeine</artifactId><version>2.9.2</version> </dependency> 2 应用 2.1 创建缓存实例 下面是创建支持缓存自动过期的缓存实例。 /…

【头歌实训】Spark MLlib ( Python 版 )

文章目录 第1关&#xff1a;基本统计编程要求测试说明答案代码 第2关&#xff1a;回归编程要求测试说明参考资料答案代码 第3关&#xff1a;分类编程要求测试说明参考资料答案代码 第4关&#xff1a;协同过滤编程要求测试说明参考资料答案代码 第5关&#xff1a;聚类编程要求测…

优秀数据库开发工具Navicat Premium 16 Mac/win中文版

Navicat Premium 16作为一款综合性的数据库开发工具&#xff0c;可以支持主流的数据库管理系统&#xff0c;如MySQL、MariaDB、Oracle、SQL Server等。无论是进行数据库建模、数据导入导出、SQL脚本编辑&#xff0c;还是数据同步、备份恢复等操作&#xff0c;Navicat Premium 1…