当前位置:网站首页>Makefile中的%标记和系统通配符*的区别
Makefile中的%标记和系统通配符*的区别
2022-08-09 08:39:00 【浩澜大大】
Makefile中的%标记和系统通配符*的区别
Makefile中的%标记和系统通配符*的区别在于,*是应用在系统中的,%是应用在这个Makefile文件中的。
(本文的测试环境是Windows7下使用MinGW提供的make.exe)
例如,如果你想编译一个文件夹下的所有.c文件,你可能会这样写:
1 %.o:%.c 2 gcc -o [email protected] $<
但是如果整个文件只有这两行的话,就会出现这样的错误:
Make: *** target not found. stop.
要知道原因,我们先来看看另一个makefile的运行过程,例如有Makefile如下:
1 test1.o:test1.c 2 3 gcc -o test1.o test1.c 4 5 6 test2.o:test2.c 7 8 gcc -o test2.o test2.c 9 10 11 all:test1.o test2.o
如果没有指定输出项目的时候Make会自动找到makefile中第一个目标中没有通配符的目标进行构造,所以步骤是:
- 构造all,发现需要test1.o和test2.o
- 这个时候他就会在Makefile文件中找到目标能匹配test1.o和test2.o的规则。
- 找到test1.o的规则并且知道test1.c存在,运行下面的命令。
- 同步骤三构造出test2.o
- 现在构造all的源文件已经齐全,构建all
其中最重要的是第2步。
Makefile的通配符是在带着目的(如“寻找test1.o”)的时候才会把他要寻找的目标套用通配符%中。
所以通配符%的意思是:
- 我要找test1.o的构造规则,看看Makefile中那个规则符合。
- 然后找到了%.o:%.c,
- 来套一下来套一下:
- %.o 和我要找的 test1.o 匹配
- 套上了,得到%=test1。
- 所以在后面的%.c就表示test1.c了。
- OK进行构造
而通配符*的意思是:
- 我不知道目标的名字,系统该目录下中所有后缀为.c的文件都是我要找的。
- 然后遍历目录的文件,看是否匹配。找出所有匹配的项目。
所以虽然连个符号的意思有点沾边,但是他们的工作方式时完全不一样。
现在知道了为什么文件中只有
1 %.o:%.c 2 gcc -o [email protected] $<
会找不到目标了吧。因为没有-f参数时Make会自动找到makefile中第一个目标中没有通配符的目标进行构造,所以就等于找不到目标了。它的意思并不会自动把文件中所有的文件都编译。
所以正确的代码应该是:
1 all:$(subst .c,.o,$(wildcard *.c)) 2 3 %.o:%.c 4 gcc -o [email protected] $<
这才是把目录下所有文件都编译的命令。
下面是几个特舒符号的意思:
[email protected]:目标的名字
$^:构造所需文件列表所有所有文件的名字
$<:构造所需文件列表的第一个文件的名字
$?:构造所需文件列表中更新过的文件
例如:
1 test1.o:test1.c 2 gcc -o [email protected] $<
[email protected]:就是test1.o
$<:就是test1.c
1 test1.o:test1.c head.c 2 gcc -o [email protected] $^
$^:就是test1.c head.c
$(subst 要被替换的字符串,用来替换的字符串,被处理的字符串):
用“用来替换的字符串”替换“被处理的字符串”中的“要被替换的字符串”
所以:
$(subst .c,.o,test1.c test2.c)
就会得到test1.o test2.o
$(wildcard 寻找的文件):
在系统中寻找文件
例如:
$(wildcard *.c)
就等于找到系统中所有后缀为.c的文件,返回成以空格隔开的一整行字符
例如:test1.c test2.c test3.c 这样
$(basename 文件名):
取得文件的名字(去掉后缀的意思)
例如:
$(basename test1.c)
就会取得test1
边栏推荐
猜你喜欢
![【MySQL】mysql:解决[Err] 1093 - You can‘t specify target table ‘表名‘ for update in FROM clause问题](/img/76/8e6a3a1c5fdc9bffc0c7c9187a027c.png)
【MySQL】mysql:解决[Err] 1093 - You can‘t specify target table ‘表名‘ for update in FROM clause问题

Different styles of Flask-restful

探索APP性能优化之稳定性优化(解决方案)

Three handshakes, four waves

路由配置转发及实验

鸿蒙开发实战一——手表篇

加密技术和电子竞技如何促进彼此的发展

ctf misc picture questions knowledge points

零搜索量的关键词,你需要布局吗?

Some of the topics in VNCTF2021 are reproduced
随机推荐
内存中的swap机制
BUUCTF MISC Writing Notes (1)
Database MySQL installation and uninstallation
VMware virtual machine cannot be connected to the Internet after forced shutdown
深度学习时代的视频理解综述
Some of the topics in VNCTF2021 are reproduced
App testing
数制之间的转换
jdbctemplate连接sql server,代码中查出来的数据跟数据库中不一致,如何解决?
Dark Horse 2022 latest redis course notes and knowledge points (for interview)
【CNN】2022 ECCV 对比视觉Transformer的在线持续学习
[Vulnerability reproduction] CVE-2018-7490 (path traversal)
Account and Permission Management
进程和计划任务
小程序调用百度api实现图像识别
requests之模拟登录学习
QT程序生成独立exe程序(避坑版)
电子产品整机结构设计的一般性思路
STM32 如何知道FLASH的使用情况
Kibana:为地图应用选择不同的语言 - Elastic Stack 8.3