makefile中的include的作用(makefile中的变量)

1、wildcard:扩展通配符2、notdir:去除路径3、patsubst:替换通配符例子:建立一个测试目录,在测试目录下建立一个名为sub的子目录$mkdirtest$cdtest$mkdirsub在test下,建立a.c和b.c2个文件,在sub目录下,建立sa.c和sb.c2个文件建立一个简单的Makef

大家好,又见面了,我是你们的朋友全栈君。

1、wildcard : 扩展通配符
2、notdir : 去除路径
3、patsubst :替换通配符

例子:

建立一个测试目录,在测试目录下建立一个名为sub的子目录

$ mkdir test

$ cd test

$ mkdir sub



在test下,建立a.c和b.c2个文件,在sub目录下,建立sa.c和sb.c2 个文件



建立一个简单的Makefile

src=$(wildcard *.c ./sub/*.c)

dir=$(notdir $(src))

obj=$(patsubst %.c,%.o,$(dir) )



all:

@echo $(src)

@echo $(dir)

@echo $(obj)

@echo “end”



执行结果分析:

第一行输出:

a.c b.c ./sub/sa.c ./sub/sb.c



wildcard把 指定目录 ./ 和 ./sub/ 下的所有后缀是c的文件全部展开。



第二行输出:

a.c b.c sa.c sb.c

notdir把展开的文件去除掉路径信息



第三行输出:

a.o b.o sa.o sb.o



在$(patsubst %.c,%.o,$(dir) )中,patsubst把$(dir)中的变量符合后缀是.c的全部替换成.o,

任何输出。

或者可以使用

obj=$(dir:%.c=%.o)

效果也是一样的。



这里用到makefile里的替换引用规则,即用您指定的变量替换另一个变量。

它的标准格式是

$(var:a=b) 或 ${var:a=b}

它的含义是把变量var中的每一个值结尾用b替换掉a



今天在研究makefile时在网上看到一篇文章,介绍了使用函数wildcard得到指定目录下所有的C语言源程序文件名的方法,这下好了,不用手工一个一个指定需要编译的.c文件了,方法如下:



SRC = $(wildcard *.c)



等于指定编译当前目录下所有.c文件,如果还有子目录,比如子目录为inc,则再增加一个wildcard函数,象这样:



SRC = $(wildcard *.c) $(wildcard inc/*.c)



也可以指定汇编源程序:

ASRC = $(wildcard *.S)



这样一来,makefile模板可修改的基本就是AVR名称和时钟频率了,其它的一般不用动了。


PS:针对patsubst我们来好好聊一聊
这是个模式替换函数

格式:$(patsubst <pattern>,<replacement>,<text> ) 
名称:模式字符串替换函数——patsubst。
功能:查找<text>中的单词(单词以“空格”、“Tab”或“回车”“换行”分隔)是否符合模式<pattern>,如果匹配的话,则以<replacement>替换。这里,<pattern>可以包括通配符“%”,表示任意长度的字串。如果<replacement>中也包含“%”,那么,<replacement>中的这个“%”将是<pattern>中的那个“%”所代表的字串。(可以用“\”来转义,以“\%”来表示真实含义的“%”字符)
返回:函数返回被替换过后的字符串。

示例:

$(patsubst %.c,%.o,x.c.c bar.c)

把字串“x.c.c bar.c”符合模式[%.c]的单词替换成[%.o],返回结果是“x.c.o bar.o”


make中有个变量替换引用

 

对于一个已经定义的变量,可以使用“替换引用”将其值中的后缀字符(串)使用指定的字符(字符串)替换。格式为“$(VAR:A=B)”(或者“${VAR:A=B}”),意思是,替换变量“VAR”中所有“A”字符结尾的字为“B”结尾的字。“结尾”的含义是空格之前(变量值多个字之间使用空格分开)。而对于变量其它部分的“A”字符不进行替换。例如:

 

foo := a.o b.o c.o

bar := $(foo:.o=.c)

 

在这个定义中,变量“bar”的值就为“a.c b.c c.c”。使用变量的替换引用将变量“foo”以空格分开的值中的所有的字的尾字符“o”替换为“c”,其他部分不变。如果在变量“foo”中如果存在“o.o”时,那么变量“bar”的值为“a.c b.c c.c o.c”而不是“a.c b.c c.c c.c”。

它是patsubst的一个简化,那么到底是简化成了什么样子呢

 

CROSS=

CC=$(CROSS)gcc

CFLAGS= -Wall 

LDFLAGS= 


PKG = src


SRCS = $(wildcard $(PKG)/inc/*.c) $(wildcard $(PKG)/*.c)

BOJS = $(patsubst %.c,%.o,$(SRCS))

#BOJS = $(SRCS: .c = .o)


#%.o:%.c

# $(CC) -c $< $(CFLAGS) -o $@


.PHONY:main

main:$(BOJS)

-$(CC) -o $@ $(CFLAGS) $^ $(LDFLAGS)

-mv main ./myfile

起初使用的是变量替换引用的方式,但是却始终不生成中间的.o文件,但是使用patsubst后,一切正常了,如果你知道为什么,请留言告诉我吧

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/125625.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 一键生成惊雷等喊麦歌词

    一键生成惊雷等喊麦歌词思路写一下 1 给一长篇的小说 利用正则表达式将小说分为无数的字符串 2 将从后到前字符串切割 最长为 n 否则一句话太长 3 并且将每一个字符串的末尾音节提取出来 普通的韵脚音的话放在一个字符数组里面 3 增加一个 hashmap 表 添加平时用的韵脚 4 将符合 hashmap 的韵脚放在字典里 5 规定歌词的格式 比如 随机从字典取出字

    2025年6月5日
    3
  • AndroidAutoSize使用简介[通俗易懂]

    AndroidAutoSize使用简介[通俗易懂]一、简介今日头条屏幕适配方案终极版,一个极低成本的Android屏幕适配方案,项目地址:https://github.com/JessYanCoding/AndroidAutoSize由于此方法是一刀切来适配,所有界面以dp为单位的都会受影响,因此一定要做好防护。二、使用1、集成//集成implementation’me.jessyan:autosize:1.2.1…

    2022年6月6日
    34
  • 使用reaver傻瓜式破解wifi之利用路由器WPS漏洞[通俗易懂]

    使用reaver傻瓜式破解wifi之利用路由器WPS漏洞[通俗易懂]跟这篇破解教程一样,网上破解教程多是基于路由器的WPS漏洞破解,但是这样的路由器只占少数。一般wifi是依据WPA/WPA2加密的,因此想要破解一般的wifi,还得破解这个协议,虽然近期这个协议也被破解了,不过也是很不容易的。刚入门破解,不是很熟悉,在网上找各种破解资料,终于破解成功了临近工作室的wifi,沾沾自喜~本文破解wifi针对一些路由器的WPS(Wi-fipro…

    2022年5月7日
    323
  • pycharm安装opencv-python_pycharm下载库

    pycharm安装opencv-python_pycharm下载库pycharm安装与环境配置;opencv与opencv_contrib安装,解决cv2.face等模块不能使用的问题;在pycharm中终端使用pip命令可以简单顺利地安装所有需要的库。

    2022年8月28日
    3
  • Python的递归函数原理和实例

    Python的递归函数原理和实例递归函数 函数体内调用了该函数本身 分为传递和回归两个过程 组成部分 递归调用和终止条件 优点 思路和代码简单 缺点 占用内存多 效率低下 实例 使用递归来计算 6 的阶乘思路 代码实现 deffunc n ifn 1 return1else returnn func n 1 print func 6 解释 实际上调用过程是 6func 5func 4func 3func 2 func 1 这个过程是传递

    2025年7月31日
    6
  • 史上最全微信运营工具「建议收藏」

    史上最全微信运营工具「建议收藏」图文排版编辑器  ●秀米:xiumi.us  ●易点编辑器:wxedit.yead.net  ●135微信编辑器:http://www.135editor.com/  ●扔赞微信编辑器:http://bianji.rengzan.com/  ●小易微信编辑器:http://xiaoyi.e7wei.com/  

    2022年6月4日
    82

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号