Makefile中的自动化变量说明

2023-10-28

前言

在做嵌入式开发的时候会经常要看到Makefile文件,来观察程序的编译过程,但是我们会经常看到诸如$@、$<、$?这种奇怪的符号,为此我进行了一番总结供大家翻看查阅。

常见自动化变量说明

$@
表示规则中的目标文件集。在模式规则中,如果有多个目标,那么,"$@"就是匹配于目标中模式定义的集合。

$%
仅当目标是函数库文件中,表示规则中的目标成员名。例如,如果一个目标是"foo.a(bar.o)“,那么,”$%“就是"bar.o”,"$@“就是"foo.a”。如果目标不是函数库文件(Unix下是
[.a],Windows下是[.lib]),那么,其值为空。

$<
依赖目标中的第一个目标名字。如果依赖目标是以模式(即"%“)定义的,那么”$<"将是符合模式的一系列的文件集。注意,其是一个一个取出来的。

$?
所有比目标新的依赖目标的集合。以空格分隔。

$^
所有的依赖目标的集合。以空格分隔。如果在依赖目标中有多个重复的,那个这个变量会去除重复的依赖目标,只保留一份。

$+
这个变量很像"$^",也是所有依赖目标的集合。只是它不去除重复的依赖目标。

$*
这个变量表示目标模式中"%“及其之前的部分。如果目标是"dir/a.foo.b”,并且目标的模式是"a.%.b",那么,“$*“的值就是"dir /a.foo”。这个变量对于构造有关联的文件名是比
较有较。如果目标中没有模式的定义,那么”$*“也就不能被推导出,但是,如果目标文件的后缀是 make所识别的,那么”$*“就是除了后缀的那一部分。例如:如果目标是"foo.c”
,因为".c"是make所能识别的后缀名,所以,“$*“的值就是"foo”。这个特性是GNU make的,很有可能不兼容于其它版本的make,所以,你应该尽量避免使用”$*“,除非是在隐含规则或是静态模式中。如果目标中的后缀是make所不能识别的,那么”$*"就是空值。

当你希望只对更新过的依赖文件进行操作时,"$?“在显式规则中很有用,例如,假设有一个函数库文件叫"lib”,其由其它几个object文件更新。那么把object文件打包的比较有效
率的Makefile规则是:
lib : foo.o bar.o lose.o win.o
ar r lib $?

在上述所列出来的自动量变量中。四个变量($@、$<、$%、$*)在扩展时只会有一个文件,而另三个的值是一个文件列表。这七个自动化变量还可以取得文件的目录名或是在当前目录下的符合模式的文件名,只需要搭配上"D"或"F"字样。这是GNU make中老版本的特性,在新版本中,我们使用函数"dir"或"notdir"就可以做到了。"D"的含义就是Directory,就是目录,"F"的含义就是File,就是文件。

下面是对于上面的七个变量分别加上"D"或是"F"的含义:
$(@D)
表示"$@“的目录部分(不以斜杠作为结尾),如果”$@“值是"dir/foo.o”,那么"$(@D)“就是"dir”,而如果"$@“中没有包含斜杠的话,其值就是”."(当前目录)。

$(@F)
表示"$@“的文件部分,如果”$@“值是"dir/foo.o”,那么"$(@F)“就是"foo.o”,“$(@F)“相当于函数”$(notdir $@)”。

“$(*D)”
“$(*F)”
和上面所述的同理,也是取文件的目录部分和文件部分。对于上面的那个例子,“$(*D)“返回"dir”,而”$(*F)“返回"foo”

“$(%D)”
“$(%F)”
分别表示了函数包文件成员的目录部分和文件部分。这对于形同"archive(member)"形式的目标中的"member"中包含了不同的目录很有用。

“$(<D)”
“$(<F)”
分别表示依赖文件的目录部分和文件部分。

“$(^D)”
“$(^F)”
分别表示所有依赖文件的目录部分和文件部分。(无相同的)

“$(+D)”
“$(+F)”
分别表示所有依赖文件的目录部分和文件部分。(可以有相同的)

“$(?D)”
“$(?F)”

分别表示被更新的依赖文件的目录部分和文件部分。

最后想提醒一下的是,对于"$<“,为了避免产生不必要的麻烦,我们最好给$后面的那个特定字符都加上圆括号,比如,”$(< )“就要比”$<"要好一些。

还得要注意的是,这些变量只使用在规则的命令中,而且一般都是"显式规则"和"静态模式规则"。其在隐含规则中并没有意义。

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

Makefile中的自动化变量说明 的相关文章

  • docker 非 root 绑定安装权限,WITH --userns-remap

    all 尝试让绑定安装权限正常工作 我的目标是在容器中绑定安装卷 以便 a 容器不以 root 用户身份运行入口点 二 docker daemon 配置了 userns remap 这样容器 主机上没有 root c 我可以绑定挂载和读 写
  • 如何使用 Cloud Init 挂载未格式化的 EBS 卷

    Context 我正在使用https wiki jenkins io display JENKINS Amazon EC2 Plugin https wiki jenkins io display JENKINS Amazon EC2 Pl
  • 在centos中安装sqlite3 dev和其他包

    我正在尝试使用 cpanel 在 centos 机器上安装 sqlite dev 和其他库 以便能够编译应用程序 我对 debian 比 centos 更熟悉 我知道我需要的库是 libsqlite3 dev libkrb5 dev lib
  • linux-x64 二进制文件无法在 linuxmusl-x64 平台上使用错误

    我正在安装Sharp用于使用 package json 的 Nodejs 项目的 docker 映像上的映像压缩包 当我创建容器时 我收到有关 Sharp 包的以下错误 app node modules sharp lib libvips
  • 执行“minikube start”命令时出现问题

    malik malik minikube start minikube v1 12 0 on Ubuntu 18 04 Using the docker driver based on existing profile Starting c
  • 尽管 if 语句,Visual Studio 仍尝试包含 Linux 标头

    我正在尝试创建一个强大的头文件 无需更改即可在 Windows 和 Linux 上进行编译 为此 我的包含内容中有一个 if 语句 如下所示 if defined WINDOWS include
  • 添加文件时运行 shell 命令

    我的 Linux 机器上有一个名为 images 的文件夹 该文件夹连接到一个网站 该网站的管理员可以向该网站添加图片 但是 当添加图片时 我想要一个命令来运行调整目录中所有图片的大小 简而言之 我想知道当新文件添加到特定位置时如何使服务器
  • CMake 链接 glfw3 lib 错误

    我正在使用 CLion 并且正在使用 glfw3 库编写一个程序 http www glfw org docs latest http www glfw org docs latest 我安装并正确执行了库中的所有操作 我有 a 和 h 文
  • 使用 MAX_ORDER / 包含 mmzone.h

    根据https www kernel org doc Documentation networking packet mmap txt https www kernel org doc Documentation networking pa
  • 如何让R使用所有处理器?

    我有一台运行 Windows XP 的四核笔记本电脑 但查看任务管理器 R 似乎一次只使用一个处理器 如何让 R 使用全部四个处理器并加速我的 R 程序 我有一个基本系统 我使用它在 for 循环上并行化我的程序 一旦您了解需要做什么 此方
  • 内核的panic()函数是否完全冻结所有其他进程?

    我想确认内核的panic 功能和其他类似kernel halt and machine halt 一旦触发 保证机器完全冻结 那么 所有的内核和用户进程都被冻结了吗 是panic 可以被调度程序中断吗 中断处理程序仍然可以执行吗 用例 如果
  • Intel 上的 gcc 中的 _mm_pause 用法

    我参考过这个网页 https software intel com en us articles benefitting power and performance sleep loops https software intel com
  • C修改printf()输出到文件

    有没有办法修改printf为了将字符串输出到文件而不是控制台 我尝试在互联网上查找一些内容 发现了类似的电话dup dup2 and fflush这可能与此有关 EDIT 也许我不清楚 问题是这是C考试问题 问题如下 解释一个通常将字符串输
  • 在生产服务器上使用 Subversion 使文件生效的最佳方法是什么?

    目前我已经设置了 subversion 这样当我在 Eclipse PDT 中进行更改时 我可以提交更改 它们将保存在 home administrator 中项目文件 该文件具有 subversion 推荐的 branches tags
  • Linux/POSIX:为什么 fork() 不分叉*所有*线程

    众所周知 POSIX下创建新进程的默认方式是使用fork 在 Linux 下 这在内部映射到clone 我想知道的是 众所周知 当一个人打电话时fork 子进程是用单个线程创建的 调用的线程fork cf https linux die n
  • Apache 访问 Linux 中的 NTFS 链接文件夹

    在 Debian jessie 中使用 Apache2 PHP 当我想在 Apache 的文档文件夹 var www 中创建一个新的小节时 我只需创建一个指向我的 php 文件所在的外部文件夹的链接 然后只需更改该文件夹的所有者和权限文件夹
  • 使用os.execlp时,为什么`python`需要`python`作为argv[0]

    代码是这样的 os execlp python python child py other args this works os execlp python child py other args this doesn t work 我读过
  • 如何让 Node.js 作为后台进程运行并且永不死掉?

    我通过 putty SSH 连接到 linux 服务器 我尝试将其作为后台进程运行 如下所示 node server js 然而 2 5 小时后 终端变得不活动 进程终止 即使终端断开连接 我是否也可以使进程保持活动状态 Edit 1 事实
  • 尽管我已在 python ctypes 中设置了信号处理程序,但并未调用它

    我尝试过使用 sigaction 和 ctypes 设置信号处理程序 我知道它可以与python中的信号模块一起使用 但我想尝试学习 当我向该进程发送 SIGTERM 时 但它没有调用我设置的处理程序 只打印 终止 为什么它不调用处理程序
  • 从 Linux 内核模块中调用用户空间函数

    我正在编写一个简单的 Linux 字符设备驱动程序 以通过 I O 端口将数据输出到硬件 我有一个执行浮点运算的函数来计算硬件的正确输出 不幸的是 这意味着我需要将此函数保留在用户空间中 因为 Linux 内核不能很好地处理浮点运算 这是设

随机推荐

  • 快速排序递归实现和非递归实现(详解)

    内容 快速排序的递归 非递归实现代码及注解 思路详解 以及快速排序的优化 目录 快速排序的递归实现 基本思想 步骤 让基准值排序到最终位置 使得左右区间自然分割开的方法有如下三种 1 hoare版本 基本思想 编辑动图演示 一些细节 代码实
  • dvwa靶场Brute Force(暴力破解)全难度教程(附代码分析)

    建议使用owaspbwa靶场可以不用搭建dvwa以及其他常用靶场 省去搭建靶场的困扰 但是此靶机靶场较老 并不建议使用 owaspbwa下载地址 OWASP Broken Web Applications Project download
  • 【C++奇遇记】函数模板

    博客主页 博主链接 本文由 M malloc 原创 首发于 CSDN 学习专栏推荐 LeetCode刷题集 数据库专栏 初阶数据结构 欢迎点赞 收藏 留言 如有错误敬请指正 未来很长 值得我们全力奔赴更美好的生活 文章目录 本章详情 函数模
  • XML的生成和解析

    一 什么是XML XML就是可扩展标记语言 HTML是超文本标记语言 标记语言就是通过一个一个的标记来组织数据的一种语法格式 与HTMl超文本语言比较的话XML这种可扩展语言它的标记是自己定义的 XML中自己定义的标记表示 例如 lt 标记
  • 复杂网络博弈:WS、NW小世界网络模型

    用Matlab程序分别绘制含有至少100个节点的WS NW小世界网络模型 并给出具体程序代码 带每行注释 Matlab版本 matlab R2022b 代码1 自己不用去创建函数体 设置节点数量为100 N 100 设置平均度数为4 K 4
  • 如何编写jstl自定义标签(示例:自定义jstl Long型时间转为date型)

    原文地址 http www cnblogs com icoding archive 2012 07 08 2581164 html 写jsp不可避免的会用到jstl 因为这个公司也没怎么用过velocity等模板 所以jstl就相对来说是比
  • 幼儿园分班问题 【Java】

    幼儿园分班问题 Java 题目描述 幼儿园两个班的小朋友在排队时混在了一起 每位小朋友都知道自己是否与前面一位小朋友是否同班 请你帮忙把同班的小朋友找出来 小朋友的编号是整数 与前一位小朋友同班用Y表示 不同班用N表示 输入描述 输入由空格
  • LaTeX 宏包(\usepackage)

    LaTeX 宏包引用及常用宏包简介 LaTeX 宏包 宏包介绍 常用宏包简介 如何安装宏包 MiKTeX Console 宏包调用 LaTeX 宏包 宏包介绍 宏包是用来扩展 增强LaTeX的功能 宏包与LaTeX的关系和浏览器插件与浏览器
  • hbuilderX自定义主题仿vscode暗黑主题

    目录 hbuilderX自定义主题仿vscode暗黑主题 效果图 设置方式 把主题代码复制进来即可 是基于雅蓝主题自定义的 设置好后需要切换到雅蓝主题 hbuilderx保存时自动整理代码 1 首先在顶部栏 找到工具 打开设置 2 点击旁边
  • net::ERR_CONNECTION_RESET 报错原因

    1 gt 向tomcat 服务器上上传视频 谷歌浏览器控制台报出 打开信地址栏后 发现 net ERR CONNECTION RESET 错误 但是此视频以经过mp4转码 注 浏览器支持的播放mp4视频编码格式为 AVC编码的H264 后发
  • Unity 打包至Android 平台 编译不通过 所遇到过的坑

    Now we are here to learn how to build a android app by unity game engine but Build 不出来咋办 你都遇到了那些情况的问题呢 1 入门 忘记设置包名 2 安装A
  • Intellj idea 中创建测试 test

    在idea中创建测试类有两种方法 1 鼠标点中类名 使用 Alt Enter 会弹出intention action gt create tests 2 鼠标点中类名 使用 Ctrl Shift T 默认 会弹出 create new te
  • 在uniapp微信小程序中实现无限级评论(vue递归组件+Java构建所有评论树状结构)

    1 前言 这是本人毕业设计中其中一个功能点 就是用户在微信小程序 使用uniapp框架 中的首页模块中可以对健身资讯进行评论或者社区模块对别人发布的动态进行评论 2 实现效果 最后放个演示视频吧 实现思路 1 首先 在前端页面中编写好一个递
  • 制作PCB的基本设计流程;

    基本流程 1 在电脑中建立一个自定义的文件夹 例如D AD project Project1 以备存储设计文件用 双击打开Altium Designer 进入软件工作界面 2 创建工程文件 单击 File 菜单 选择 New 选项中的 Pr
  • [知识/工具/安全渗透测试]简洁明了的Google Hacking教程,效率UPUP

    Google Hacking 简介 Google Hacking 是指利用谷歌搜索引擎中的高级操作符 在搜索结果中定位特定的文本字符串 依托于谷歌强大的后台爬虫数据库 灵活使用可大大提高效率 前排提醒 请遵守法律法规 科学上网 不要用于非法
  • 语音合成技术

    转自 https zhuanlan zhihu com p 27395458 语音合成又称文语转换 Text To Speech 简称TTS 指通过机械的 电子的方法生成语音的技术 随着科技的发展 合成语音的自然度和音质均得到了明显的改善
  • 在 MVC 4 中使用RDLC 报表

    前期知识点 RDLC 报表 Visual Studio NET进入2005版本以后 Crystal Report与IDE的结合更 紧密 了 至少我们看不到那个讨厌的注册窗口了 但是 Microsoft似乎并不容忍在自己的超级工具中竟然没有报
  • 如何完全卸载HbuilderX

    今天本来想发行打包安卓端 结果发现突然就不行了 前天还行 报错 然后我找了各种原因 排查了很久才发现是HbuilderX编辑器的问题 机智如我 所以我们需要重新去下载一个HbuilderX 但是问题来了 很多人不知道怎么卸载 我自己网上也百
  • EasyExcel使用、合并

    写入EXCEL 有两种方法 其一是通过 直接代码控制 缺点是不好掌握整个的页面设计 合并策略 根据 行开始和结束 进行控制 合并列 参数 mergeRowIndex 开始行 endmergeRowIndex截至行 mergeColumnIn
  • Makefile中的自动化变量说明

    文章目录 前言 常见自动化变量说明 前言 在做嵌入式开发的时候会经常要看到Makefile文件 来观察程序的编译过程 但是我们会经常看到诸如 lt 这种奇怪的符号 为此我进行了一番总结供大家翻看查阅 常见自动化变量说明 表示规则中的目标文件