首页 > 其他分享 >【make】makefile变量全解

【make】makefile变量全解

时间:2025-01-19 16:30:00浏览次数:3  
标签:输出 gcc CFLAG 变量 make makefile echo 全解

目录

在这里插入图片描述

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
在这里插入图片描述

标签:输出,gcc,CFLAG,变量,make,makefile,echo,全解
From: https://blog.csdn.net/qq_44653106/article/details/145116695

相关文章

  • 【make】makefile 函数全解
    目录makefile简介函数全解介绍相关链接字符串处理函数subst函数—字符串替换patsubst函数—模式字符串替换strip函数—去空格findstring函数—查找字符串filter函数—过滤器filter-out函数—过滤器sort函数—排序word函数—取单词wordlist函数—......
  • Windows环境下xmake安装配置,创建编译运行项目
     Windows环境下xmake安装配置,创建编译运行项目视频地址:https://www.bilibili.com/video/BV1NHwqe3Ewn/?spm_id_from=333.1387.homepage.video_card.click&vd_source=7c7ae5cc1dbb2453e1eb43950a4264a31、访问xmake网站,根据安装环境选择对应安装方法(1)访问网站:https://xmake.i......
  • Makefile快速入门教程
    Makefile快速入门教程本教程旨在帮助读者全面深入地掌握Makefile的编写与使用。Makefile是一种用于自动化编译和构建程序的文件,通过定义一系列规则和命令,能够高效地管理项目的编译过程,尤其在大型项目中,其优势尤为明显。本教程从基础概念入手,逐步深入到高级特性,涵盖了M......
  • 完全解读布隆过滤器
    布隆过滤器(BloomFilter)是1970年由布隆提出的,是一种非常节省空间的概率数据结构,运行速度快,占用内存小。它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中。主要用于判断一个元素是否在一个集合中。主要是解决大规模......
  • 【3DGS (1) 】3D Gaussian Splatting全解 (原理+代码+公式) - 笔记
    文章目录1-什么是splatting?2-Splatting的流程3-为什么3dgaussian:是椭球?4-各向异性和各向同性是什么意思?5-`协方差矩阵`怎么就能控制椭球形状呢?6-协方差矩阵怎么就能用旋转和缩放矩阵表达?7-仿射变换本文为B站3DGS讲解视频-【1】捏雪球的文字笔记,以及个......
  • 创建一个CMake项目
    本文将演示如何使用CMake管理一个中等复杂度的项目,从创建项目到编译和运行的整个过程,涵盖了从基本配置到高级特性的实际应用。实战内容如下:创建CMakeLists.txt文件:定义项目、库、可执行文件和测试。编写源代码和测试:编写代码和测试文件。创建构建目录:保持源代码目录整......
  • 【日志分析】从手动解析到智能检测:日志异常模式挖掘全解
    网罗开发(小红书、快手、视频号同名)  大家好,我是展菲,目前在上市企业从事人工智能项目研发管理工作,平时热衷于分享各种编程领域的软硬技能知识以及前沿技术,包括iOS、前端、HarmonyOS、Java、Python等方向。在移动端开发、鸿蒙开发、物联网、嵌入式、云原生、开源......
  • linux m、mm、mmm函数和make的区别
    在Linux内核开发和Android开发中,构建系统通常使用 make 命令来编译和构建项目。而在Android开发环境中,还有 m、mm 和 mmm 等命令,这些命令是Android构建系统的一部分,提供了更高效和便捷的构建方式。以下将详细介绍这些命令的功能、使用场景和区别。一、make 命令......
  • Linux驱动开发:一文掌握 块设备VS字符设备开发流程全解!
    Linux驱动开发是嵌入式系统开发中的一个重要组成部分,它直接关系到硬件设备的功能实现和性能优化。在Linux系统中,驱动开发主要分为字符设备驱动、块设备驱动和网络设备驱动三大类。本文将重点介绍字符设备和块设备的基础知识,以及它们在驱动开发中的差异和开发流程。一、字符设......
  • 消息队列实战指南:三大MQ 与 Kafka 适用场景全解析
    前言:在当今数字化时代,分布式系统和大数据处理变得愈发普遍,消息队列作为其中的关键组件,承担着系统解耦、异步通信、流量削峰等重要职责。ActiveMQ、RabbitMQ、RocketMQ和Kafka作为市场上极具代表性的消息队列产品,各自拥有独特的功能特性与适用场景。本博客旨在深入剖析这四种消......