【Makefile由浅入深完全学习记录5】预定义变量的使用

今天学习Makefile预定义变量的使用,加qq:1126137994.微信:liu1126137994一起学习更多技术!!!

1.预定义变量:自动变量

在Makefile中存在一些预定义过的变量,我们可以直接拿来使用而不用自己再定义

  • 自动变量
$@ , $^ , $<
  • 特殊变量
$(MAKE) , $(MAKECMDGOALS) , $(MAKEFILE_LIST) , $(MAKE_VERSION) , $(CURDIR) , $(.VARIABLES) ...

我们先来看看特殊变量的意义:
-$@
*代表当前规则中,触发命令后,会被执行的目标

-$^
*代表当前规则中的所有的依赖

-$<
*代表当前规则中的第一个依赖

自动变量的使用示例如下所示:


all : first second third@echo "\$$@ => $@"@echo "$$^ => $^"@echo "$$< => $<"

注意:

1. "$"对于Makefile来讲具有特殊含义,所以输出时,要加一个"$"进行转义2. "$@"队友Bash shell 具有特殊意义,所以输出时需要加上"\"进行转义

下面给出一个例子来理解上述的概念:


.PHONY : all first second third all : first second third@echo "\$$@ => $@"@echo "$$^ => $^"@echo "$$< => $<"firtst:
second:
third:

输入make运行后,显示:
这里写图片描述

下面我们将第四课的Makefile修改一下,使用自动变量让内容更简洁(点击查看第四课的博客:第四课内容)

CC := g++
TARGET := hello-world.out$(TARGET) : func.o main.o$(CC) -o $(TARGET) func.o main.ofunc.o : func.c$(CC) -o func.o -c func.cmain.o : main.c$(CC) -o main.o -c main.c.PHONY : rebuild clean allrebuild : clean allall : $(TARGET)clean :rm *.o $(TARGET)

将上述Makefile修改为以下的内容:


CC := g++
TARGET := hello-world.out$(TARGET) : func.o main.o$(CC) -o $@ $^func.o : func.c$(CC) -o $@ -c $^main.o : main.c$(CC) -o $@ -c $^.PHONY : rebuild clean allrebuild : clean allall : $(TARGET)clean :$(RM) *.o $(TARGET)

可以看出,使用自动变量后,Makefile的内容变得更简洁!!!

2.预定义变量:特殊变量

一些特殊变量的意义:

  • $(MAKE) 当前make解释器的文件名
  • $(MAKECMDGOALS) 命令行中指定的目标名(make的命令行参数)
  • $(MAKEFILE_LIST) make所需要处理的makefile文件列表,当前makefile的文件名总是处于列表最后,文件名之间以空格分离

看下面的例子来更加深刻的理解上述三个变量的意义:


.PHONY : all out first second third testall out : @echo "$(MAKE)"@echo "$(MAKECMDGOALS)"@echo "$(MAKEFILE_LIST)"first :@echo "first"second :@echo "second"third :@echo "third"test :@$(MAKE) first@$(MAKE) second@$(MAKE) third

输入:make test:
这里写图片描述
输入:make all :
这里写图片描述
输入:make first :
这里写图片描述

一些特殊变量的意义:

  • $(MAKE_VERSION) 代表当前make解释器的版本
  • $(CURDIR) 代表当前make解释器的工作目录
  • $(.VARIABLES) 所有已经定义了的变量名列表(预定义和自定义的变量都包括在内)

看下面一个例子来理解一下上面三个特殊变量的意义与使用方法:


.PHONY : test1 test2TDelphi := Delphi Tang
D.T.Software := D.T.test1 :@echo "$(MAKE_VERSION)"@echo "$(CURDIR)"@echo "$(.VARIABLES)"test2 :@echo "$(RM)"

输入make运行结果为:
这里写图片描述
从上面运行结果可以看出我的make的版本是:3.81 make解释器的目录为:/home/delphi 而且可以在变量名列表中找到我们定义的变量D.T.Software 与 TDelphi

3.总结

  1. makefile中提供了预定义变量供开发者使用
  2. 预定义变量的使用能够使开发变得更加高效
  3. 自动变量是makefile中最常见的变量
  4. 使用$(.VARIABLES)能够获取所有的特殊变量

想一起探讨以及获得各种学习资源加我:
qq:1126137994
微信:liu1126137994
可以共同交流关于嵌入式,操作系统,C++语言,C语言,数据结构等技术问题。

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

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

相关文章

【Makefile由浅入深完全学习记录6】Makefile中变量的高级主题上

抓住基础&#xff0c;学习更多技术&#xff0c;迎接挑战&#xff0c;加qq&#xff1a;1126137994 微信&#xff1a;liu1126137994 一起学习更多技术~ 上一篇文章学习了makefile中的预定义变量的使用&#xff0c;今天来继续学习makefile中的变量&#xff01; 1、变量值的替换 …

USB转WIFI无线网卡驱动程序(内核自带RT5370驱动程序添加)的移植记录之二

学习交流加 个人qq&#xff1a; 1126137994个人微信&#xff1a; liu1126137994学习交流资源分享qq群&#xff1a; 962535112 今天记录我在I.MX6Q平台添加内核自带RT5370无线网卡驱动程序的过程&#xff0c;加qq1126137994 微信&#xff1a;liu1126137994 共同学习更多技术&…

Node.js安装详细步骤教程(Windows版)

Node.js安装详细步骤教程(Windows版) 什么是Node.js&#xff1f; 简单的说 Node.js 就是运行在服务端的 JavaScript。 Node.js是一个基于 Chrome V8 引擎的 JavaScript 运行环境&#xff1b; Node.js使用一个事件驱动、非阻塞式 I/O 的模型&#xff0c;使其轻量且高效&…

移植wpa_supplicant软件与DHCP软件解密WPA/WPA2 加密的无线网络

加qq1126137994与微信&#xff1a;liu1126137994 一起学习更多技术&#xff01; 现在的无线网络基本都是 WPA/WPA2 加密方式的&#xff0c;当我们在嵌入式Linux平台要实现无线网卡连接无线网时&#xff0c;我们需要一些工具来解密WPA/WPA2 加密方式的无线网。wpa_supplicant软…

xshell 连接不了 centos7

xshell 连接不了 centos7 采用的是net模式 有一段时间没有使用虚拟机了&#xff1a;今天打开后突然不能使用了&#xff0c;发现主机ping不通虚拟机了&#xff0c;而虚拟机可以正常联网&#xff0c;可以ping主机 查了一下 vmnet8 自动分配的 ipv4 和虚拟机 分配的网关地址没…

java多线程思维导图

分享是最好的整理&#xff0c;利用csdn 平台保存一下

【Makefile由浅入深完全学习记录7】Makefile中变量的高级主题下

加qq&#xff1a;1126137994 微信&#xff1a;liu1126137994 一起学习更多技术~ 继续上一篇文章关于变量的学习&#xff01; 1、环境变量&#xff08;全局变量&#xff09; -makefile中能够直接使用环境变量的值 如果makefile中定义了同名变量&#xff0c;则环境变量将被覆…

【Makefile由浅入深完全学习记录8】条件判断语句

加qq&#xff1a;1126137994 微信&#xff1a;liu1126137994 一起学习更多技术~ 今天来学习Makefile中条件判断语句&#xff01; Makefile也算是一门语言&#xff0c;它有自己的语法&#xff0c;那么它应该也会像C/C语言一样&#xff0c;支持条件判断语句&#xff01; Makef…

C语言实现位数组(bit数组)与位数组的简单应用举例

学习交流加&#xff08;可免费帮忙下载CSDN资源&#xff09;&#xff1a;个人微信&#xff1a; liu1126137994学习交流资源分享qq群1&#xff08;已满&#xff09;&#xff1a; 962535112学习交流资源分享qq群2&#xff1a; 780902027 今天有朋友遇到一个笔试题&#xff1a;一个…

【常见笔试面试算法题12】动态规划算法案例分析

学习交流加 个人qq&#xff1a; 1126137994个人微信&#xff1a; liu1126137994学习交流资源分享qq群&#xff1a; 962535112 文章目录1、暴力搜索方法2、记忆搜索方法3、动态规划方法4、各种动态规划方法案例总结&#xff1a;给定数组arr&#xff0c;arr中所有数都为正数&…

kafka 思维导图

最近在培训沟通力过程中&#xff0c;一句话说的特别好&#xff0c;有输入就要有输出&#xff0c;最近又学习了一遍kafka 给大家分享一下

【C++深度剖析教程28】C++对象模型分析

学习交流加 个人qq&#xff1a; 1126137994个人微信&#xff1a; liu1126137994学习交流资源分享qq群&#xff1a; 962535112 今天记录学习的内容是&#xff1a;C对象模型分析&#xff01;&#xff01;&#xff01; 本质分析&#xff1a; class是一种特殊的struct 在内存中cl…

【C++深度剖析教程29】C++对象模型分析下

加qq1126137994&#xff0c;微信&#xff1a;liu1126137994 一起学习更多技术&#xff01;&#xff01;&#xff01; 今天来继续学习C对象模型&#xff01; 在C编译器内部&#xff0c;类可以理解为结构体子类是由父类成员叠加子类新成员得到的 下面来写一个程序分析C的继承…

java 思维导图

最近有时间&#xff0c;又整理了一下java 思维导图&#xff0c;持续优化中 子模块拆分总结&#xff1a;java基础 java思维导图 总结

【常见笔试面试算法题12续集一】动态规划算法案例1台阶问题练习题

加qq1126137994 一起学习更多技术&#xff01;&#xff01;&#xff01; 以下问题&#xff0c;都可以用非动态规划的方法做&#xff0c;我为了整理动态规划的方法思路&#xff0c;就全部用动态规划的思路来解决问题&#xff0c;这样还可以简化问题的处理&#xff0c;是时间复杂…

linux 思维导图

工作中使用总结的linux 分享一下

【常见笔试面试算法题12续集二】动态规划算法案例2矩阵最小路径和练习题

加qq1126137994 一起学习更多技术&#xff01;&#xff01;&#xff01; 有一个矩阵map&#xff0c;它每个格子有一个权值。从左上角的格子开始每次只能向右或者向下走&#xff0c;最后到达右下角的位置&#xff0c;路径上所有的数字累加起来就是路径和&#xff0c;返回所有的…

mysql数据库思维导图

先前总结的一下数据库的思维导图&#xff0c;和大家分享一下&#xff0c;持续更新&#xff1b; 最近面试数据仓库工程师&#xff0c;过程中&#xff0c;问到索引类型&#xff0c;只是记得&#xff0c;普通索引&#xff0c;唯一索引&#xff0c;还有主键&#xff0c;面试中让说…

【常见笔试面试算法题12续集三】动态规划算法案例分析3 LIS练习题(最长上升子序列)

学习交流加 个人qq&#xff1a; 1126137994个人微信&#xff1a; liu1126137994学习交流资源分享qq群&#xff1a; 962535112 这是一个经典的LIS(即最长上升子序列)问题&#xff0c;请设计一个尽量优的解法求出序列的最长上升子序列的长度。 给定一个序列arr及它的长度n(长度小…

【常见笔试面试算法题12续集四】动态规划算法案例分析4 LCS练习题练习题(最长公共子序列的长度)

学习交流加 个人qq&#xff1a; 1126137994个人微信&#xff1a; liu1126137994学习交流资源分享qq群&#xff1a; 962535112 给定两个字符串A和B&#xff0c;返回两个字符串的最长公共子序列的长度。例如&#xff0c;A"1A2C3D4B56”&#xff0c;B"B1D23CA45B6A”&am…