【make】makefile变量全解

news/2025/1/19 23:59:38/

目录

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

在这里插入图片描述

makefile>makefile_3">makefile>makefile简介

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

变量全解

  变量是makefile>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=100override b+= fun.c
#override 还可以重新定义命令包
override define fun@echo 200
endefall:@echo $(a)@echo $(b)$(fun)#输出
100
time.c show.c fun.c        
200#如果写成下面的样子,那么不仅会输出命令,还会执行命令,上面的写法只会执行命令,而不会输出命令
override define funecho 200
endef
#输出
100
time.c show.c fun.c
echo 200
200

目标指定变量

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

CFLAG=-gplay: CFLAG=-c
play: main.o a.o b.ogcc $^ -o $@main.o:main.cgcc $(CFLAG) $^ -o $@a.o:a.cgcc $(CFLAG) $^ -o $@b.o:b.cgcc $(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.igcc $(CFLAG) $^ -o $@
%.o: CFLAG=-c
b.o:b.sgcc $(CFLAG) $^ -o $@a.d:a.cgcc $(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
在这里插入图片描述


http://www.ppmy.cn/news/1564523.html

相关文章

Java 数据结构 队列之双端队列 常用方法 示例代码 及其实现

目录 常用方法 示例代码 常见实现 Java中的双端队列(Deque,Double Ended Queue)是一种队列,它允许在队列的两端插入和删除元素。与普通队列(FIFO)不同,双端队列的元素可以从队列的两端进行添…

wireshark 网络分析工具

✍作者:柒烨带你飞 💪格言:生活的情况越艰难,我越感到自己更坚强;我这个人走得很慢,但我从不后退。 📜系列专栏:网络安全从菜鸟到飞鸟的逆袭 目录 一、网络截获数据包的基础1、以太网…

【2024博客之星评选】走过这一年,踏上新阶梯

个人主页~ 非常荣幸我能通过审核进入到TOP300的年度评选当中,作为一名大二的学生,这对我来说不仅是一次激励,更是一个新的起点,在这里我将以回顾的方式讲述一下这一年在CSDN中走过的路 走过这一年 零、引言一、初遇二、成长三、机…

晨辉面试抽签和评分管理系统之十二:如何让同一批、不同组别的面试考生抽到连续的号码?

晨辉面试抽签和评分管理系统(下载地址:www.chenhuisoft.cn)是公务员招录面试、教师资格考试面试、企业招录面试等各类面试通用的考生编排、考生入场抽签、候考室倒计时管理、面试考官抽签、面试评分记录和成绩核算的面试全流程信息化管理软件。提供了考生…

阿里云通义实验室自然语言处理方向负责人黄非:通义灵码2.0,迈入 Agentic AI

通义灵码是基于阿里巴巴通义大模型研发的AI 智能编码助手,在通义灵码 1.0 时代,我们针对代码的生成、补全和问答,通过高效果、低时延,研发出了国内最受欢迎的编码助手。 在通义灵码 2.0 发布会上,阿里云通义实验室自然…

python中自动化playwright录制功能跳过繁琐的系统登录操作

1.在自己的终端上执行下面的命令会,生成录制页面 playwright codegen --save-storageauth.json2.在录制页面中,仔细地输入自己需要登录的网址。如果该网址需要输入账号和密码才能登录,那么请准确地输入相应的账号和密码。如果有验证码的情况&…

替换数据库不是谁好就用谁

哪个数据库优秀不一定都能达成一致的意见 在1.4日的PG上海生态大会上,我发言大致是:每个人都有自己主观意愿。比如MySQL和PG的争论,无论线上还是线下都是难解难分。主观意愿定了,很难改变。即使心里认,但是嘴上也不说…

STM32 FreeRTOS 信号量

信号量的简介 reeRTOS中的信号量是一种用于任务间同步和资源管理的机制。信号量可以是二进制的(只能取0或1)也可以是计数型的(可以是任意正整数)。信号量的基本操作包括“获取”和“释放”。 比如动车上的卫生间,一个…