抓住基础,学习更多技术,迎接挑战,加qq:1126137994 微信:liu1126137994 一起学习更多技术~

上一篇文章学习了makefile中的预定义变量的使用,今天来继续学习makefile中的变量!

1、变量值的替换

变量值的替换:
*使用指定字符(串),替换变量值中的后缀字符(串)
-语法格式:$(var:a=b)${var:a=b}.
注意事项:

  • 替换表达式中不能有任何的空格
  • make中支持使用${}对变量进行取值
    举个例子:
src := a.o b.o c.o
obj := $(src:cc=o)test:@echo "obj => $(obj)"

变量的模式替换:

*使用%保留变量值中的指定字符,替换其他字符
-语法格式:$(var:a%b=x%y) 或者 ${var:a%b=x%y}

注意事项:

  • 替换表达式中不能有任何空格
  • make中支持使用${}对变量进行取值

举个例子深刻理解一下:

src: a1b.c a2b.c a3b.c
obj: $(src:a%b.c=x%y)test:@echo "obj => $(obj)"

下面给出一个简单的示例来理解上面的语法:

src1 := a.cc b.cc c.cc
obj1 := $(src1:cc=o)test :@echo "obj1 => $(obj1)"src2 := a11b.c a22b.c a33b.c
obj2 := $(src2:a%b.c=x%y)test2 :@echo "obj2 => $(obj2)"

输入:make test
显示:obj1 => a.o b.o c.o
输入:make test2
显示:obj2 => x11y x22y x33y

规则中的模式替换:


意义:
通过target-pattern 从tagets中匹配子目标;再通过prereq-pattern从子目标生成依赖;进而构成完整的规则!!!

下面是一个规则中的模式替换案例:

OBJS := func.o main.o
$(OBJS) : %.o : %.cgcc -o $@ -c $^

等价于下面的:

func.o : func.cgcc -o $@ -c $^
main.o : main.cgcc -o $@ -c $^

下面看一个规则中的模式替换的案例:
main.c程序:


extern void foo();int main()
{foo();return 0;
}

func.c程序

#include "stdio.h"extern char* g_hello;void foo()
{printf("void foo() : %s\n", g_hello);
}

const.c程序:

const char* g_hello = "hello makefile";

上述三个程序为源程序,编译他们的makefile文件为:


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

输入make进行编译:
显示:g++ -o hello-makefile.out func.o main.o const.o

执行生成的可执行文件:
./hello-makefile.out
显示:
void foo() : hello makefile

2、变量值的嵌套引用

变量值的嵌套引用:
*一个变量名之中,可以包含对其他变量的引用
*嵌套引用的本质是用一个变量表示另外一个变量

命令行变量:
*运行make时,在命令行定义变量
*命令行变量默认覆盖makefile中定义的变量

override关键字:
*用于指示makefile中定义的变量不能被覆盖
*变量的定义和赋值都需要用override关键字

define关键字:
*用于在makefile中定义多行变量
*多行变量的定义从变量名开始,到endef结束
*可使用override关键字防止定义的变量被覆盖
*define定义的变量等价于使用 “=” 定义的变量(递归赋值)

下面给出一个例子来理解上述的语法理论:


hm := hello makefileoverride var := override-testdefine foo
I'm fool!
endefoverride define cmd@echo "run cmd ls ..."@ls
endeftest :@echo "hm => $(hm)"@echo "var => $(var)"@echo "foo => $(foo)"${cmd}

输入make,显示:

3、总结

  • 变量值的替换($(var:a=b) 或者 ${var:a=b}
  • 变量的模式替换($(var:a%b=x%y) 或者 ${var:a%b=x%y}
  • makefile支持将模式替换直接用在规则中
  • makefile中的变量值可以嵌套使用
  • 命令行中定义的变量可以覆盖makefile中的变量
  • override用于指示makefile中的变量不能被覆盖
  • define用于makefile中定义值为多行的变量

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

本学习记录完全来源于狄泰软件学院的相关课程,可以加我q:1126137994或者Q群:199546072 ,给你推荐更多学习课程。

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

  1. 【Makefile由浅入深完全学习记录1】认识make和makefile

    学习交流加 个人qq: 1126137994 个人微信: liu1126137994 学习交流资源分享qq群: 962535112 今天开始学习项目又多了一项:Makefile由浅入深完全学习.之前做 ...

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

    加qq:1126137994 微信:liu1126137994 一起学习更多技术~ 继续上一篇文章关于变量的学习! 1.环境变量(全局变量) -makefile中能够直接使用环境变量的值 如果make ...

  3. 【Makefile由浅入深完全学习记录3】伪目标的引入

    只有不停的努力,才能看起来很轻松!!!加qq1126137994共同学习探讨更多技术!!! 1.思考: makefile中的目标究竟是什么? 在默认的情况下: make认为目标对应一个文件 make比 ...

  4. 【Makefile由浅入深完全学习记录2】初识 makefile 的结构

    继续学习makefile,希望尽快掌握makefile好在面试中更好的掌握方向!加qq1126137994一起学习更多技术!! 1.回顾 makefile的意义: makefile用于定义源文件之间的 ...

  5. 【Makefile由浅入深完全学习记录4】变量和不同的赋值方式

    今天来学习Makefile中变量的不同的赋值方式!努力的意义就是让贫穷不再限制你的想象!加qq共同学习交流1126137994 1.概念 makefile中支持程序设计中变量的概念 makefile中 ...

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

    加qq:1126137994 微信:liu1126137994 一起学习更多技术~ 今天来学习Makefile中条件判断语句! Makefile也算是一门语言,它有自己的语法,那么它应该也会像C/C+ ...

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

    今天学习Makefile预定义变量的使用,加qq:1126137994.微信:liu1126137994一起学习更多技术!!! 1.预定义变量:自动变量 在Makefile中存在一些预定义过的变量,我 ...

  8. 三维荧光学习记录--在Origin中绘制三维荧光光谱图(补充)及荧光区域积分(FRI)

    三维荧光学习记录–在Origin中绘制三维荧光光谱图(补充)及荧光区域积分(FRI) 注:本文仅作为自己的学习记录以备以后复习查阅 关于区域积分的简介,大家可以去看我之前的文章,这里就不赘述了,主要想 ...

  9. 三维荧光学习记录--在Origin中绘制三维荧光光谱图

    三维荧光学习记录–在Origin中绘制三维荧光光谱图 注:本文仅作为自己的学习记录以备以后复习查阅 记录一下如何在Origin中绘制三维荧光光谱图(数据分析的学习之路任重而道远啊~~) 一.数据准备 ...

最新文章

  1. 向DataTable中添加自定义的行
  2. MessageBox只弹出一次
  3. Python入门学习(四)
  4. 战棋类中实现的移动范围
  5. oracle 日志切换太频繁,关于oracle日志切换的问题
  6. HDU2855 Fibonacci Check-up 矩阵的应用
  7. 聊一聊C# 8.0中的await foreach
  8. python部落稿酬_Python之父考虑重构Python解释器
  9. linux内核 lts长期演进,Linux Kernel 4.19 和 5.4 生命周期延长至 6 年
  10. JVM初学之JVM的垃圾回收机制与垃圾回收器
  11. 14.Adding Frontend Files to your Module
  12. HOOK大神用c++制作绝地求生自瞄物品透视,源码仅供娱乐!
  13. JSP内置对象及其常用方法
  14. 大数据与云计算、物联网三者的区别和关联
  15. 如何建语料库_如何建设语料?
  16. The Heads-Up Grid 让你的HTML页面具有辅助线网格功能
  17. allure报告中去掉allure.title中自动拼接的参数
  18. IR2110自举电容充电原理
  19. OC小游戏之英雄打怪兽
  20. ​科技“新冷战”核心技术突破!道翰天琼认知智能机器人平台API接口大脑为您揭秘

热门文章

  1. spring学习(48):自动装配中定义的bean的作用域
  2. 第二十八期:阿里云VS腾讯云 谁才是中国未来的云计算之王?
  3. java学习(167):生产者消费者问题
  4. 玩转oracle 11g(41):rman备份-00554或者04005
  5. 无线网卡共享Internet访问到电脑有线接口注意事项
  6. elementui表格-改变某一列的样式
  7. 常用方法 DataTable转换为Entitys
  8. 读书印记 - 《混乱:如何成为失控时代的掌控者》
  9. 在Google Maps 上点击标签后显示说明
  10. 选择不相交区间(贪心算法) By ACReaper