【make】makefile变量全解

目录

  • makefile简介
  • 变量全解
    • 变量基础
    • 变量高级使用
      • 1. 将变量里的值进行替换后输出
      • 2. 使用变量的嵌套使用
      • 3. `$` 可以组合使用
    • override 指示符
    • 目标指定变量
    • 模式变量
  • 总结
  • 参考链接

在这里插入图片描述

makefile简介

  makefile 是一种类似shell的脚本文件,需要make工具进行解释 makefile 内的语句,然后执行内部语句。Makefile的作用是去管理工程项目,比如一个项目有很多c文件,需要利用Makefile去统一进行编译或者其他操作。[1]

变量全解

  变量是makefile中非常重要的组成部分,下面是变量的使用全解。

变量基础

使用 $() 来获取变量,太简单了,略。

变量高级使用

1. 将变量里的值进行替换后输出

src = a.c b.c d.c e.so
# 下面的例子是将src 的末尾含 .c 的替换为 .o
obj = $(src:.c=.o)

all:
    @echo $(obj)
#输出
a.o b.o d.o e.so

2. 使用变量的嵌套使用

$ 符号可以嵌套获取值

av = bv
bv = cv
cv = embed
all:
    @echo $($($(av)))

#输出
embed

3. $ 可以组合使用

first = Donald
last = Trump
Donald_Trump = "I'M BACK!"

all:
    @echo $($(first)_$(last))                        

#输出       
I'M BACK!


#甚至 $ 符号可以作为左值
Donald_$(last) = "I'M BACK!"


#甚至 $ 符号 可以代表函数内的值
src= a b d c z y w o
res = $(sort $(src))
all:
    @echo $(res)
#输出
a b c d o w y z

override 指示符

这个指示符的作用是给make 命令添加的参数进行修改

#执行命令  make a=10 b="time.c show.c" fun="@echo 20" all
override a=100

override b+= fun.c
#override 还可以重新定义命令包
override define fun
    @echo 200
endef

all:
    @echo $(a)
    @echo $(b)
    $(fun)

#输出
100
time.c show.c fun.c        
200


#如果写成下面的样子,那么不仅会输出命令,还会执行命令,上面的写法只会执行命令,而不会输出命令
override define fun
    echo 200
endef
#输出
100
time.c show.c fun.c
echo 200
200

目标指定变量

这个变量可以理解成,因为某个目标而改变的依赖所具有的变量。相当于局部变量,这个局部变量只用于这些依赖。

CFLAG=-g

play: CFLAG=-c
play: main.o a.o b.o
    gcc $^ -o $@

main.o:main.c
    gcc $(CFLAG) $^ -o $@

a.o:a.c
    gcc $(CFLAG) $^ -o $@

b.o:b.c
    gcc $(CFLAG) $^ -o $@

.PHONY:clean
clean:
    -rm *.o play             
#执行 make play
#输出
gcc -c main.c -o main.o
gcc -c a.c -o a.o
gcc -c b.c -o b.o
gcc main.o a.o b.o -o play            
#执行 make b.o
#输出
gcc -MM b.c -o b.o

上面案例可以看出,全局的 CFLAG 并没有作用在局部。

模式变量

这个模式变量和上面的类似,只不过目标变成了模式,也就是说这一模式的目标都使用这个局部变量代替全局变量。

CFLAG=-MM
%.i: CFLAG=-E
b.i:b.c 
    gcc $(CFLAG) $^ -o $@
%.s: CFLAG=-S
b.s:b.i
    gcc $(CFLAG) $^ -o $@
%.o: CFLAG=-c
b.o:b.s
    gcc $(CFLAG) $^ -o $@

a.d:a.c
    gcc $(CFLAG) $^ -o $@  
#执行 make b.o
#输出
gcc -E b.c -o b.i
gcc -S b.i -o b.s
gcc -c b.s -o b.o   
#执行 make a.d
#输出
gcc -MM a.c -o a.d

上面案例中的模式必须使用到 % ,用法和上面的类似。

总结

暂时只有以上使用总结,其他使用可参考帮助文档。

参考链接

gnu make 帮助手册
百度百科— make
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

51单片机入门_02_C语言基础0102

C语言基础部分可以参考我之前写的专栏C语言基础入门48篇 以及《从入门到就业C全栈班》中的C语言部分,本篇将会结合51单片机讲差异部分。 课程主要按照以下目录进行介绍。 文章目录 1. 进制转换2. C语言简介3. C语言中基本数据类型4. 标识符与关键字5. 变量与常量6.…

常见的同态加密算法收集

随着对crypten与密码学的了解,我们将逐渐深入学习相关知识。今天,我们将跟随同态加密的发展历程对相关算法进行简单的收集整理 。 目录 同态加密概念 RSA算法 ElGamal算法 ELGamal签名算法 Paillier算法 BGN方案 Gentry 方案 BGV 方案 BFV 方案…

aws(学习笔记第二十六课) 使用AWS Elastic Beanstalk

aws(学习笔记第二十六课) 使用aws Elastic Beanstalk 学习内容: AWS Elastic Beanstalk整体架构AWS Elastic Beanstalk的hands onAWS Elastic Beanstalk部署node.js程序包练习使用AWS Elastic Beanstalk的ebcli 1. AWS Elastic Beanstalk整体架构 官方的guide AWS…

FastAPI + GraphQL + SQLAlchemy 实现博客系统

本文将详细介绍如何使用 FastAPI、GraphQL(Strawberry)和 SQLAlchemy 实现一个带有认证功能的博客系统。 技术栈 FastAPI:高性能的 Python Web 框架Strawberry:Python GraphQL 库SQLAlchemy:Python ORM 框架JWT&…

C语言连接Mysql

目录 C语言连接Mysql下载 mysql 开发库 方法介绍mysql_init()mysql_real_connect()mysql_query()mysql_store_result()mysql_num_fields()mysql_fetch_fields()mysql_fetch_row()mysql_free_result()mysql_close() 完整代码 C语言连接Mysql 下载 mysql 开发库 方法一&#xf…

嵌入式知识点总结 Linux驱动 (二)-uboot bootloader

针对于嵌入式软件杂乱的知识点总结起来,提供给读者学习复习对下述内容的强化。 目录 1.什么是bootloader? 2.Bootloader的两个阶段 3.uboot启动过程中做了哪些事? 4.uboot和内核kernel如何完成参数传递? 5.为什么要给内核传递…

JVM对象分配内存如何保证线程安全?

大家好,我是锋哥。今天分享关于【JVM对象分配内存如何保证线程安全?】面试题。希望对大家有帮助; JVM对象分配内存如何保证线程安全? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在JVM中,对象的内存分配是通过堆内存进行的。…

利用飞书机器人进行 - ArXiv自动化检索推荐

相关作者的Github仓库 ArXivToday-Lark 使用教程 Step1 新建机器人 根据飞书官方机器人使用手册,新建自定义机器人,并记录好webhook地址,后续将在配置文件中更新该地址。 可以先完成到后续步骤之前,后续的步骤与安全相关&…

OpenCV:在图像中添加噪声(瑞利、伽马、脉冲、泊松)

目录 简述 1. 瑞利噪声 2. 伽马噪声 3. 脉冲噪声 4. 泊松噪声 总结 相关阅读 OpenCV:在图像中添加高斯噪声、胡椒噪声-CSDN博客 OpenCV:高通滤波之索贝尔、沙尔和拉普拉斯-CSDN博客 OpenCV:图像处理中的低通滤波-CSDN博客 OpenCV&…

github制作静态网页

打开gihub并新建仓库 命名仓库:xxx.github.io 点击create repository进行创建 点击蓝色字体“creating a new file”创建文件 文件命名为index.html, 并编写html 右上角提交 找到setttings/pages,修改路径,点击保存,等…

从 SAP 功能顾问到解决方案架构师:破茧成蝶之路

目录 行业瞭望:架构师崭露头角 现状剖析:功能顾问的局限与机遇 能力跃迁:转型的核心要素 (一)专业深度的掘进 (二)集成能力的拓展 (三)知识广度的延伸 &#xff0…

unity学习23:场景scene相关,场景信息,场景跳转

目录 1 默认场景和Assets里的场景 1.1 scene的作用 1.2 scene作为project的入口 1.3 默认场景 2 场景scene相关 2.1 创建scene 2.2 切换场景 2.3 build中的场景,在构建中包含的场景 (否则会认为是失效的Scene) 2.4 Scenes in Bui…

36、【OS】【Nuttx】OSTest分析(2):环境变量测试

背景 2025.1.29 蛇年快乐! 接之前wiki 35、【OS】【Nuttx】OSTest分析(1):stdio测试(五) 已经分析完了第一个测试项,输入输出端口测试,接下来分析下环境变量测试,也比较…

使用Ollama本地部署DeepSeek R1

前言 DeepSeek是一款开源的智能搜索引擎,能够通过深度学习技术提高搜索的智能化水平。如果你正在寻找一种方式来将DeepSeek部署在本地环境中,Ollama是一个非常方便的工具,它允许你在本地快速部署并管理各种基于AI的模型。 在本篇博客中&…

libOnvif通过组播不能发现相机

使用libOnvif库OnvifDiscoveryClient类, auto discovery new OnvifDiscoveryClient(QUrl(“soap.udp://239.255.255.250:3702”), cb.Build()); 会有错误: end of file or no input: message transfer interrupted or timed out(30 sec max recv delay)…

Visual Studio使用GitHub Copilot提高.NET开发工作效率

GitHub Copilot介绍 GitHub Copilot 是一款 AI 编码助手,可帮助你更快、更省力地编写代码,从而将更多精力集中在问题解决和协作上。 GitHub Copilot Free包含哪些功能? 每月 2000 代码补全,帮助开发者快速完成代码编写。 每月 …

HTB:Forest[WriteUP]

连接至HTB服务器并启动靶机 分配IP:10.10.16.21 靶机IP:10.10.10.161 靶机Domain:forest.htb 目录 连接至HTB服务器并启动靶机 信息收集 使用rustscan对靶机TCP端口进行开放扫描 将靶机TCP开放端口号提取并保存 使用nmap对靶机TCP开放端…

项目集成GateWay

文章目录 1.环境搭建1.创建sunrays-common-cloud-gateway-starter模块2.目录结构3.自动配置1.GateWayAutoConfiguration.java2.spring.factories 3.pom.xml4.注意:GateWay不能跟Web一起引入! 1.环境搭建 1.创建sunrays-common-cloud-gateway-starter模块…

STM32 PWM驱动直流电机

接线图: 代码配置: 根据驱动舵机的代码来写,与舵机不同的是,这次的引脚接到了PA2上,所以需要改一下引脚以及改为OC3通道。 另外还需在配置两个GPIO引脚,来控制电机的旋转方向,这里连接到了PA4与…

强大到工业层面的软件

电脑数据删不干净,简直是一种让人抓狂的折磨!明明已经把文件扔进了回收站,清空了,可那些残留的数据就像牛皮癣一样,怎么也除不掉。这种烦恼简直无处不在,让人从头到脚都感到无比烦躁。 首先,心…