Makefile中四种常用等式(= := += ?=)与自动化变量$X的实例说明

2023-11-06

1 引言

在阅读Makefile时经常会碰到一些“奇怪的符号”,比如?=、:= 、+=;还有$@,$<,$^等; 之前也都看过了解,但是时间一长,回过头来看就又忘记了,这里做个简单的记录,方便同样遇到困惑的同学查询。

1 四种常用等式(= := += ?=)

1.1 四种等式的作用

序号 等式 作用说明
1 = 延时变量,即make会将整个makefile展开后,再决定变量的值
2 := 立即变量,即在定义时它的值就已经确定了
3 ?= 如果没有被赋值过就赋予等号后面的值; 有赋值过,则还是原来的值
4 += 在原先已赋值的内容后,再追加等号后面的值进去

1.2 举例说明:

#---------------------1、“=”
	#在shell执行make后会将整个makefile展开后,再决定变量的值。即延时变量,
	#也就是说,变量的值将会是整个makefile中最后被指定的值。
	#看例子:
	x = foo
	y = $(x) bar
	x = xyz
	
	#在上例中,y的值将会是 xyz bar ,而不是 foo bar 。
	
#---------------------2、“:=”
	#“:=”表示变量的值决定于它在makefile中的位置,
	#而不是整个makefile展开后的最终值。
	x := foo
	y := $(x) bar
	x := xyz
	
	#在上例中,y的值将会是 foo bar ,而不是 xyz bar 了。
	
#---------------------3、“?=”
	## ?=的作用上述代码的意思就是,如果变量 name 前面没有被赋值,
	##那么此变量就是“abc222”,
	##如果前面已经赋过值了,那么就使用前面赋的值
	name = abc111
	name ?= abc222
	print:                     
		@echo name:$(name)  
	#输出的结果为:  name:abc111

#---------------------4、“+=”
	##知识点① +=的作用给前面已经定义好的变量添加一些字符串进去
	OBJECT   :=main.o add.o 
	OBJECT   +=dec.o
	@echo OBJECT:$(OBJECT) 
	
	#在上例中,OBJECT的值将会是OBJECT:main.o add.o dec.o

2 自动化变量符号$X

2.1 自动化变量符号$X说明

  1. Makefile常用的为3个: $@ 、 $^ 和 $< ,,作用如下;
    在这里插入图片描述
  2. 其他用到的$X符号,作用如下:
    在这里插入图片描述

2.2 $X实例说明

 objects = main.o add.o dec.o
main: $(objects)   ##这里下面用$@表示目标main
	gcc -o $@ $(objects)

%.o : %.c  ##这里下面用$^和$<效果一样,因为如果依赖文件是以模式(即“%” )定义的,那么“$<”就是符合模式的一系列的文件集合
	gcc -c $^  
clean:
	rm *.o
	rm main

3 其他Makefile常用语法

除了以上2点,在Makefile阅读中还会遇到其他的“奇怪点”,比如通配符: %、*、?; 比如常用选项:-f-CM=-D;比如常用函数:foreachwildcardpatsubstsubst等,本人整理一篇Makefile常用知识点.pdf,由于篇幅有限,有兴趣的同学可-关.注-我的同名_公-众.号“慢慢Coding”,回复Makefile即可;

在这里插入图片描述

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

Makefile中四种常用等式(= := += ?=)与自动化变量$X的实例说明 的相关文章

  • 找出 Linux 上的默认语言

    有没有办法从C语言中找出Linux系统的默认语言 有 POSIX API 可以实现这个功能吗 例如 我想要一个人类可读格式的字符串 即德语系统上的 German 或 Deutsch 法语系统上的 French 或 Francais 等 有类
  • 为 CMake 中的子目录生成“干净”目标

    我想生成一个clean子目录的目标 我的项目结构是这样的 app A B lib A B C 有时我只想在 app A 上运行干净 并且不想清理库 是否可以告诉 CMake 生成clean每个目录的目标 或者像这样的自定义目标应用程序清理哪
  • 未找到 Gem 命令

    我已经在 Ubuntu 10 10 32 位上安装了 gem apt get install gem y 但当我尝试跑步时 gem install something gem 我收到未找到命令的错误 bash gem command not
  • 查看 Linux 上的多核或多 CPU 利用率

    我有一个在 Linux 上运行的程序 我需要确定它如何利用所有 CPU 内核 有没有什么程序可以查看这些信息 跑过 top 命令并按下 1 查看各个核心
  • 运行此处编译的 C 程序会导致在另一台服务器上找不到 GLIBC 库错误 - 是我的错还是他们的错?

    此处编译的 C 程序在我们的 Ubuntu 服务器上运行良好 但是当其他人尝试在他们的特定 Linux 服务器上运行它时 他们会收到以下错误 myprog install lib tls libc so 6 version GLIBC 2
  • 使用 ProcessBuilder 运行 shell 脚本

    我正在尝试使用 Java 和 ProcessBuilder 运行脚本 当我尝试运行时 我收到以下消息 error 2 没有这样的文件或目录 我不知道我做错了什么 但这是我的代码 ps 我尝试只执行不带参数的脚本 错误是相同的 String
  • 在 Linux 控制台中返回一行?

    我知道我可以返回该行并用以下内容覆盖其内容 r 现在我怎样才能进入上一行来改变它呢 或者有没有办法打印到控制台窗口中的特定光标位置 我的目标是使用 PHP 创建一些自刷新的多行控制台应用程序 Use ANSI 转义码 http en wik
  • 在 MAC OSX 上使用 CMake 生成 .bundle 文件

    我想生成一个可执行文件 bundle文件于Mac OSX 10 6 8 using CMake 我的 CMakeLists txt 文件如下所示 cmake minimum required VERSION 2 8 PROJECT TEST
  • 如何在perl中使用O_ASYNC和fcntl?

    我想使用 O ASYNC 选项 当管道可以读取时 SIGIO 的处理程序将运行 但以下代码不起作用 任何人都可以帮助我吗 bin env perl use Fcntl SIG IO sub print catch SIGIO n my fl
  • 完整的 C++ i18n gettext()“hello world”示例

    我正在寻找完整的 i18ngettext 你好世界的例子 我已经开始了一个基于的脚本使用 GNU gettext 的本机语言支持教程 https web archive org web 20130330233819 http oriya s
  • 提高mysql导入速度[关闭]

    Closed 这个问题是与编程或软件开发无关 help closed questions 目前不接受答案 我有一个很大的数据库22GB 我曾经用过进行备份mysqldumpgzip 格式的命令 当我提取 gz 文件时 它会生成 sql文件的
  • 在cmake中设置PKG_CONFIG_PATH

    我已经在本地构建了 opencv 并将其安装到本地目录 不是系统默认目录 opencv pc存在于该本地文件夹中的 pkgconfig 文件夹下 我怎样才能找到这个opencv pc来自 cmake 因为我想从我的程序链接并包含 openc
  • 用于时间线数据的类似 gnuplot 的程序

    我正在寻找一个类似 gnuplot用于在时间轴中绘制数据图表的程序 类似 gnuplot 在 Linux 上运行 命令行功能 GUI 对我帮助不大 可编写脚本的语法 输出为 jpg png svg 或 gif 输出应该是这样的 set5 s
  • 如何将 gnatmake/gnatbind/gnatlink 集成到 C/Ada 代码的 CMake 文件中?

    我用几种语言 C C Fortran77 Fortran90 编写了代码 并且可以使用 CMake 编译它 没有任何问题 效果很完美 现在 我想在用 C 编写的 main 中添加一些 Ada 函数 并且我想通过 CMake 编译它 鉴于我无
  • 如何判断给定目标是库还是可执行文件?

    内置功能install TARGETS 将库目标安装到可执行目标之外的其他位置 我想做类似的事情 给定目标名称列表 我想将其中的所有库目标添加到列表变量中 并将所有运行时目标添加到另一个变量中 我找不到 CMake 的默认目标属性列表 但我
  • 在嵌入式系统上将内核控制台发送到哪里?

    我正在开发一个嵌入式系统 该系统当前通过串行端口 1 上的控制台输出启动 Linux 使用启动加载程序中的控制台启动参数 然而 最终我们将使用这个串行端口 内核控制台输出的最佳解决方案是什么 dev null 能否以某种方式将其放在 pty
  • aarch64 Linux 硬浮点或软浮点

    linux系统有arm64 有arm架构armv8 a 如何知道 Debian 运行的是硬浮动还是软浮动 符合 AAPCS64 GNU GCC for armv8仅提供硬浮动aarch64工具链 这与 armv7 a 的 GCC 不同 后者
  • 在用户程序中使用 或在驱动程序模块代码中使用 ...这有关系吗?

    我正在开发一个设备驱动程序模块和关联的用户库来处理ioctl 来电 该库获取相关信息并将其放入一个结构中 该结构被传递到驱动程序模块中并在那里解压 然后进行处理 我省略了很多步骤 但这就是总体思路 一些数据通过结构体传递ioctl is u
  • 如何回忆上一个 bash 命令的参数?

    Bash 有没有办法回忆上一个命令的参数 我通常这样做vi file c其次是gcc file c Bash 有没有办法回忆上一个命令的参数 您可以使用 or 调用上一个命令的最后一个参数 Also Alt can be used to r
  • 从哪里获取 iostream.h

    我正在尝试在 Linux 中做一些事情 但它抱怨找不到 iostream h 我需要安装什么才能获取此文件 这个标准头的正确名称是iostream没有扩展名 如果您的编译器仍然找不到它 请尝试以下操作 find usr include na

随机推荐

  • AndroidTreeView中的列表树形展示 点击弹出树形结构中的某个列表并关闭已经打开的列表

    想看详情 链接如下 https download csdn net download sinat 28238111 10545762 public class MyTestFragment extends Fragment private
  • 二进制的简单应用

    include
  • SQL Server 存储过程返回结果集的几种方式

    SQL Server 返回结果集的几种方式 2017年12月18日 21 52 24 xxc1605629895 阅读数 7033更多 分类专栏 sqlserver 版权声明 本文为博主原创文章 遵循 CC 4 0 BY SA 版权协议 转
  • adc0832工作原理详解_ADC0832芯片介绍

    芯片的应用 模 数 AD 和数 模 DA 转换是模拟 电路和数字电路进行沟通的渠道 从前面的课程我们知道 数字电路里 电平只有 高和低两种状态 比如 5V 和 0V 对应着 1 和 0 模拟电路里 电平则理论上有无数 个状态 比如 0V 0
  • 高德地图报错 Uncaught TypeError: AMap.Geocoder is not a constructor

    原本我是这样写的 但是在谷歌或者其他浏览器的时候就报错了 而且谷歌等浏览器 pc端是只能定位到附近的基站 出现这个报错可以添加 AMap plugin AMap Geocoder function
  • chroot的作用及详解

    什么是 chroot chroot 即 change root directory 更改 root 目录 在 linux 系统中 系统默认的目录结构都是以 即是以根 root 开始的 而在使用 chroot 之后 系统的目录结构将以指定的位
  • 在线机械键盘测试软件,键盘检测软件(DAS G2 104/105 Keyboard Test Tool)

    DAS G2 104 105 Keyboard Test Tool是一款主要针对新老键盘测试的工具 可以测试键盘的连键盘 坏键 按键响应时间 软件相关 根据测试人员从近百次的测试结果 50篇发文反馈来看 我们的硬核测试逐步得到了一些读者的关
  • java 文件pem,在Java中,仅用PEM文件创建SSLContext的最简单方法是什么?

    I used LetsEncrypt s CertBot to generate PEM files for free In other languages it is easy to start an HTTPS server using
  • sparkStreaming中用sparksql时遇到的问题总结

    问题一 今天准备用sparkStreaming接入kafka再写入hive 准备在流里面执行sparksql 按照官网的写法 一开始的代码是这样的 SparkConf sparkConf new SparkConf setMaster lo
  • python3.8静态人脸识别

    一 安装依赖库 pip install dlib pip install numpy pip install face recognition pip install opencv python 二 准备图片 1 已知图片 2 未知图片 三
  • Java中数组的使用

    数组的目的 用于存放多个类型相同的变量 一 1 数组初始化 动态初始化 初始化时只指定数组的长度 初始值由系统自动分配 int a new int 3 说明 左边 在栈内存中 存储局部变量 使用完立即消失 int 说明数据类型为int类型
  • 懒加载lazy

    目录 一 mybatis中的懒加载 二 Bean的懒加载 一 mybatis中的懒加载 一对多查询 mybatis中要不加fetchType默认lazy 即懒加载 问题 我要查询人员记录列表时 用queryRecordByParam时效率慢
  • xml的特殊字符

    在写xml文件的时候 需要注意有5个特殊的字符 分别是 lt gt 如果在文件中需要写入这5个字符的时候 需要转换处理 常用处理方式有转义字符和CDATA 转义字符 在 XML 中有 5 个预定义的实体引用 lt lt 小于 gt gt 大
  • 简单的API服务器搭建

    首先需要下载一个Nginx 高性能的HTTP和反向代理服务器 安装 brew install Nginx Step1 配置conf文件 Mac上默认
  • 路由器修改hosts实现域名劫持

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 我需要将某个网址 劫持到自己的内网某个IP 例如访问www baidu com 实际上要跳转到我内网的192 168 1 1 路由器一般是定制的linux系统 只要想办法打
  • Verilog -- 序列模三(整除3)检测器

    Verilog 序列模三 整除3 检测器 描述 输入口是1bit 每次进来一位数据 检查当前序列是否能整除3 能则输出1 否则输出0 例如 序列 1 out 0 序列 11 out 1 序列 110 out 1 序列 1101 out 0
  • java架构师面试核心问题

    java架构师面试核心问题 源码与视屏讲解同步 但都不是最重要的 具体实现 最重要的是快速过书 然后回退一遍画圈 重思想 一些特别的实现只要是源码能发布就发布 视屏讲解里的和源码配合发布 不是源码的不发布 第一部分 java的高质量编码与性
  • python面试——基础数据类型

    此篇指南是针对python中易混淆的知识点和内置的数据类型 1 python是解释执行的编译语言 相较于c 这类编译后执行的语言效率低一些 a 10 3 3 3 3 3 3 a 10 2 5 0 a 10 3 3 3 3 3 3 b 10
  • java 8集合操作

    1 过滤 过滤出年龄大于30的用户 List
  • Makefile中四种常用等式(= := += ?=)与自动化变量$X的实例说明

    1 引言 在阅读Makefile时经常会碰到一些 奇怪的符号 比如 还有 lt 等 之前也都看过了解 但是时间一长 回过头来看就又忘记了 这里做个简单的记录 方便同样遇到困惑的同学查询 1 四种常用等式 1 1 四种等式的作用 序号 等式