【Linux操作系统】makefile入门:一个规则-两个函数-三个变量

news2025/1/19 14:11:28

在Linux中,makefile是一种非常重要的工具,用于自动化构建和管理项目。它可以帮助开发人员轻松地编译和链接程序,同时还可以处理依赖关系和增量构建等问题。在makefile中,我们将重点介绍makefile中的一个规则,两个函数和三个自动变量。
在这里插入图片描述

文章目录

    • 1. 一个规则
      • 1.1 规则解释
      • 1.2 规则举例
      • 1.3 代码解释
    • 2. 两个函数
      • 2.1 $(wildcard pattern)
      • 2.2 $(patsubst pattern,replacement,text)
    • 3. 三个变量
      • 3.1 $@
      • 3.2 $<
      • 3.3 $^
    • 总结


1. 一个规则

1.1 规则解释

Makefile由一系列规则组成,每个规则定义了一个目标(target),以及生成该目标所需的依赖项(dependencies)生成命令(recipe)

当目标的依赖项发生变化时,Makefile会根据规则自动执行生成命令,更新目标。

Makefile规则的基本格式如下:

target: dependencies
    recipe
  • target是规则的目标,即要生成的文件或执行的操作。可以是一个文件名、一个标签(例如all),或者一个伪目标(以.PHONY声明)。
  • dependencies是目标所依赖的文件或目标。当任何一个依赖项发生变化时,Make工具会重新构建目标。
  • recipe是生成目标的命令序列。每个命令都必须以Tab键开头,并且在同一行上。可以是编译、链接、复制文件等任何Shell命令。

Makefile中可以有多个规则,每个规则独占一行。Make工具会根据规则的依赖关系自动确定构建顺序。

另外,Makefile还支持一些特殊的目标和变量:

  • .PHONY:声明一个伪目标,表示该目标不对应任何实际的文件。通常用于定义一些特殊的操作,如clean
  • .DEFAULT_GOAL:定义默认的目标。如果没有指定目标,则默认构建该目标。
  • $(CC):定义变量。可以在Makefile中使用变量来代替常用的命令和选项,方便管理和修改。

需要注意的是,Makefile中的规则和命令必须严格遵循缩进规则,命令必须以Tab键开头。否则,Make工具可能无法正确解析和执行。


1.2 规则举例

下面是一个简单的Makefile示例:

CC = gcc
CFLAGS = -Wall -g

all: hello

hello: main.o hello.o
    $(CC) $(CFLAGS) -o hello main.o hello.o

main.o: main.c
    $(CC) $(CFLAGS) -c main.c

hello.o: hello.c
    $(CC) $(CFLAGS) -c hello.c

clean:
    rm -f hello *.o

1.3 代码解释

这个Makefile定义了一个目标all,它依赖于目标hello。目标hello又依赖于目标main.ohello.o。这些目标之间的依赖关系告诉Make工具在构建目标hello之前需要先构建main.ohello.o

每个目标下面的生成命令使用Tab键缩进,这是Makefile的语法要求。在这个例子中,生成命令使用$(CC)$(CFLAGS)变量来指定编译器和编译选项。

除了上面的规则外,还定义了一个目标clean,用于清理生成的目标文件和可执行文件。

使用这个Makefile,可以在终端中执行以下命令:

  • make:构建所有目标,默认会构建all目标,即hello
  • make hello:构建hello目标。
  • make clean:清理生成的目标文件和可执行文件。

执行make命令时,Make工具会根据目标和依赖关系判断哪些文件需要重新编译,然后执行相应的生成命令。如果目标已经是最新的,Make工具会跳过它的构建。

当执行make命令后,如果源文件没有修改,Make工具会输出类似于以下的结果:

make: 'hello' is up to date.

这表示目标已经是最新的,没有需要重新构建的文件。

如果执行make clean命令,Make工具会执行清理操作,删除生成的目标文件和可执行文件。


2. 两个函数

在Makefile中,除了$(wildcard pattern)函数,还有一个常用的函数$(patsubst pattern,replacement,text)。它用于将指定文本中符合模式的部分替换为指定的字符串。

下面分别介绍$(wildcard pattern)$(patsubst pattern,replacement,text)函数的用法和示例:

2.1 $(wildcard pattern)

$(wildcard pattern)函数用于匹配文件名模式,返回符合模式的文件列表。

例如,假设当前目录下有以下文件:file1.txtfile2.txtfile3.dat

FILES := $(wildcard *.txt)
all:
    @echo $(FILES)

运行make命令后,输出结果为:

file1.txt file2.txt

解释$(wildcard *.txt)匹配当前目录下所有以.txt结尾的文件,返回文件列表file1.txtfile2.txt。然后,$(FILES)将文件列表赋值给变量FILES,最后在all目标中使用@echo命令输出变量FILES的值。


2.2 $(patsubst pattern,replacement,text)

$(patsubst pattern,replacement,text)函数用于将指定文本中符合模式的部分替换为指定的字符串。

例如,假设有一个包含文件名的列表FILES,需要将其中的.txt替换为.o

FILES := file1.txt file2.txt file3.dat
TARGETS := $(patsubst %.txt,%.o,$(FILES))

all: $(TARGETS)

%.o: %.txt
    @echo Generating $@ from $<
    @touch $@

运行make命令后,输出结果为:

Generating file1.o from file1.txt
Generating file2.o from file2.txt

解释$(patsubst %.txt,%.o,$(FILES))将列表$(FILES)中以.txt结尾的文件名替换为以.o结尾的文件名,生成一个新的文件列表TARGETS,即file1.ofile2.ofile3.dat。然后,在all目标中使用$(TARGETS)作为依赖项,为每个.txt文件生成一个.o文件。


3. 三个变量

在Makefile中,有三个常用的变量:$@$<$^。它们分别表示目标文件、第一个依赖文件和所有依赖文件的列表。

下面分别介绍这三个变量的用法和示例:

3.1 $@

$@表示目标文件,即当前规则中的目标。

例如,假设有一个规则如下所示:

all: main.o utils.o
    gcc $^ -o $@

运行make命令后,输出结果为:

gcc main.o utils.o -o all

解释:$^表示所有的依赖文件,即main.outils.o$@表示目标文件,即all。在这个规则中,gcc $^ -o $@命令将所有的依赖文件编译链接成一个可执行文件all


3.2 $<

$<表示第一个依赖文件,即当前规则中的第一个依赖文件。

例如,假设有一个规则如下所示:

main.o: main.c
    gcc -c $<

运行make命令后,输出结果为:

gcc -c main.c

解释:$<表示第一个依赖文件,即main.c。在这个规则中,gcc -c $<命令将main.c文件编译成目标文件main.o


3.3 $^

$^表示所有的依赖文件的列表。

例如,假设有一个规则如下所示:

all: main.o utils.o
    gcc $^ -o $@

运行make命令后,输出结果为:

gcc main.o utils.o -o all

解释:$^表示所有的依赖文件,即main.outils.o$@表示目标文件,即all。在这个规则中,gcc $^ -o $@命令将所有的依赖文件编译链接成一个可执行文件all


总结

综上所述,makefile中的一个规则,两个函数和三个自动变量是我们在Linux开发中经常使用的重要工具。通过灵活运用这些工具,我们可以更高效地构建和管理项目,提高开发效率。

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

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

相关文章

PE半透明屏是怎么制造的?工艺、材料、应用

PE半透明屏是一种新型的屏幕材料&#xff0c;具有半透明的特点。 它由聚乙烯&#xff08;PE&#xff09;材料制成&#xff0c;具有良好的透明度和柔韧性。PE半透明屏广泛应用于建筑、广告、展览等领域&#xff0c;具有很高的市场潜力。 PE半透明屏的特点之一是其半透明性。 它…

关于Java的IO流开发

IO概述 回想之前写过的程序&#xff0c;数据都是在内存中&#xff0c;一旦程序运行结束&#xff0c;这些数据都没有了&#xff0c;等下次再想使用这些数据&#xff0c;可是已经没有了。那怎么办呢&#xff1f;能不能把运算完的数据都保存下来&#xff0c;下次程序启动的时候&a…

区块链技术助力慈善,为您的善举赋予全新力量!

我们怀揣着一颗温暖的心&#xff0c;秉承着公开透明的理念&#xff0c;带着信任与责任&#xff0c;倾力打造了一套区块链技术驱动的去中心化捐赠与物资分发系统&#xff0c;通过智能生态网络&#xff08;IEN&#xff09;解决捐赠不透明问题的系统&#xff0c;让您的善举直接温暖…

Flutter父宽度自适应子控件的宽度

需求&#xff1a; 控件随着金币进行自适应宽度 image.png 步骤&#xff1a; 1、Container不设置宽度&#xff0c;需要设置约束padding&#xff1b; 2、文本使用Flexible形式&#xff1b; Container(height: 24.dp,padding: EdgeInsetsDirectional.only(start: 8.dp, end: 5.d…

vue- 创建wms-web项目

vue 发展历程 安装vite 第一步 创建wms-web项目 第二步 打开文件夹并安装所有开发环境的依赖 都可以放静态资源 public>vite.svg 不会重新编译成其他名字 assets>vue.svg 会重新编译成一个随机的名称 重新编译 启动 第三步 spa 单页渲染 第四步 安装路由 第五步 …

再次斩获第一,文心3.5霸榜国内大模型

目录 1 什么是文心一言&#xff1f;2 体验与文心一言对话3 文心3.5霸榜国内大模型 1 什么是文心一言&#xff1f; 文心一言是百度全新一代知识增强大语言模型&#xff0c;文心大模型家族的新成员&#xff0c;能够与人对话互动&#xff0c;回答问题&#xff0c;协助创作&#xf…

FPGA_时钟显示(时钟可调)

1. 实验说明 在数码管显示数据的基础上&#xff0c;让六位数码管显示数字时钟&#xff0c;并且通过按键可以对时间进行修改。 实验目标&#xff1a;六位数码管分别显示时间的时分秒&#xff0c;且通过按键可实现加减调整时间及清零功能。 key1: 切换键&#xff1a;选择待…

Vue [Day4]

组件的三大组成部分 组件的样式冲突 scoped <style scoped></style>data 是一个函数 components/BaseButton.vue <template><div class"BaseButton"><button click"count--">-</button><span>{{ count }}</…

单调队列-求一定范围内的最大值和最小值

一、链接 154. 滑动窗口 二、题目 给定一个大小为 n≤106n≤106 的数组。 有一个大小为 kk 的滑动窗口&#xff0c;它从数组的最左边移动到最右边。 你只能在窗口中看到 kk 个数字。 每次滑动窗口向右移动一个位置。 以下是一个例子&#xff1a; 该数组为 [1 3 -1 -3 5…

第九节 文件操作

文章目录 1. 引言2. 基本的文件操作2.1 打开文件2.1.1 mode 访问模式2.1.2 文件不存在,则创建文件2.1.3 二进制打开文件2.1.4 打开文件时&#xff0c;指定编码方式 2.2 关闭文件2.2.1 with 打开语句结构 2.3 文件的读写2.3.1 写入文件内容2.3.2 读取文件2.3.2.1 read&#xff0…

计算机网络-性能指标

计算机网络-性能指标 文章目录 计算机网络-性能指标简介速率比特速率 带宽吞吐量时延时延计算 时延带宽积往返时间网络利用率丢包率总结 简介 性能指标可以从不同的方面来度量计算机网络的性能 常用的计算机网络的性能指标有以下8个 速率带宽吞吐量时延时延带宽积往返时间利…

前端例程20230806:彩色灯珠装饰

演示 这里页面四周的彩色灯珠是会随着页面调整自动调整位置的。 代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta na…

6.4.tensorRT高级(1)-UNet分割模型导出、编译到推理(无封装)

目录 前言1. Unet导出2. Unet推理总结 前言 杜老师推出的 tensorRT从零起步高性能部署 课程&#xff0c;之前有看过一遍&#xff0c;但是没有做笔记&#xff0c;很多东西也忘了。这次重新撸一遍&#xff0c;顺便记记笔记。 本次课程学习 tensorRT 高级-Unet分割模型导出、编译到…

【数据结构】Disruptor环形数组无锁并发框架阅读

Disruptor 是苹国外厂本易公司LMAX开发的一个高件能列&#xff0c;研发的初夷是解决内存队列的延识问顾在性能测试中发现竟然与10操作处于同样的数量级)&#xff0c;基于Disruptor开发的系统单线程能支撑每秒600万订单&#xff0c;2010年在QCn演讲后&#xff0c;获得了业界关注…

C++ 的 string 是用什么编码方式储存字符串的

代码 创建一个文件&#xff0c;用二进制的方式将字符串写入文件中 FileStream fs("test.txt", FileMode::Create);string str("测试文本");fs.Write((uint8_t *)str.c_str(), 0, str.length());return 0;其中 FileStream 是我对 fstream 的封装。 打开文…

p7付费课程笔记6:CMS GC

目录 前言 工作步骤 缺点 问题 前言 上一章节我们讲了串/并行GC&#xff0c;这一章节说下CMS GC。看前思考一个问题&#xff0c;并行GC与CMS GC的区别在哪里。 什么是CMS收集器 CMS(Concurrent Mark-Sweep)是以牺牲吞吐量为代价来获得最短回收停顿时间的垃圾回收器。对于…

2023年8月实时获取地图边界数据方法,省市区县街道多级联动【附实时geoJson数据下载】

首先&#xff0c;来看下效果图 在线体验地址&#xff1a;https://geojson.hxkj.vip&#xff0c;并提供实时geoJson数据文件下载 可下载的数据包含省级geojson行政边界数据、市级geojson行政边界数据、区/县级geojson行政边界数据、省市区县街道行政编码四级联动数据&#xff0…

PHP8条件控制语句-PHP8知识详解

我们昨天说了流程控制的结构有顺序结构、选择结构和循环结构。选择结构就是条件结构。 条件控制语句就是对语句中不同条件的值进行判断&#xff0c;进而根据不同的条件执行不同的语句。 在本文中&#xff0c;学习的是if语句、if…else语句、if…elseif语句和switch语句。 1、…

配置固定二级子域名远程访问内网群晖NAS 7.X版 【内网穿透】——“cpolar内网穿透”

配置固定二级子域名远程访问内网群晖NAS 7.X版 【内网穿透】 文章目录 配置固定二级子域名远程访问内网群晖NAS 7.X版 【内网穿透】前言1. 创建一条固定数据隧道2. 找到“保留二级子域名”栏位3. 重新编辑之前建立的临时数据隧道4. 进入“在线隧道列表”页面5. 在其他浏览器访问…

【山河送书第五期】:《码上行动:利用Python与ChatGPT高效搞定Excel数据分析》参与活动,送书三本!!

《码上行动&#xff1a;利用Python与ChatGPT高效搞定Excel数据分析》 前言内容提要本书亮点购买链接参与方式往期赠书回顾&#xff1a; 前言 在过去的 5 年里&#xff0c;Python 已经 3 次获得 TIOBE 指数年度大奖&#xff0c;这得益于数据科学和人工智能领域的发展&#xff0…