*是应用在系统中的通配符,%是应用在这个Makefile文件中的通配符。

例如,如果你想编译一个文件夹下的所有.c文件,你可能会这样写:
1 %.o:%.c
2     gcc -o $@ $<
但是如果整个文件只有这两行的话,就会出现这样的错误:
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 $@ $<
会找不到目标了吧。因为没有-f参数时Make会自动找到makefile中第一个目标中没有通配符的目标进行构造,所以就等于找不到目标了。它的意思并不会自动把文件中所有的文件都编译。

所以正确的代码应该是:
1 all:$(subst .c,.o,$(wildcard *.c))

3 %.o:%.c
4     gcc -o $@ $<
这才是把目录下所有文件都编译的命令。

下面是几个特殊符号的意思:
    $@:目标的名字
    $^:构造所需文件列表所有所有文件的名字
    $<:构造所需文件列表的第一个文件的名字
    $?:构造所需文件列表中更新过的文件

例如:
1 test1.o:test1.c
2     gcc -o $@ $<
$@:就是test1.o
$<:就是test1.c

1 test1.o:test1.c head.c
2     gcc -o $@ $^
$^:就是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

linux中的通配符指的是?相关推荐

  1. Linux中的通配符

    Bash Shell本身不支持正则表达式,使用正则表达式的是Shell命令和工具,如grep, sed, awk等,但是,Bash Shell可以使用正则表达式中的一些元字符实现通配(Globbing ...

  2. linux 通配符 正则表达式 区别,linux 正则表达式和通配符

    linux 正则表达式和通配符 通配符用于查找文件 包含三种:  * ? [] * 代表任意个任意字符 ? 代表任意一个字符 [] 代表中括号中的一个字符 正则表达式(正则是包含匹配,只要包含就可以匹 ...

  3. Linux中的18个tar命令

    1. 在 Linux 中创建 tar 存档文件 下面的示例命令将创建一个tar存档文件rumenz-14-09-12.tar对于目录/home/rumenz在当前工作目录中.请参阅示例命令的操作. # ...

  4. linux命令chmod如果当前用户属于多个组,那这个命令中的g指的是哪个组?按什么规则?

    linux命令chmod如果当前用户属于多个组,那这个命令中的g指的是哪个组?按什么规则? 比如这种命令 chmod u=rwx,g=rw,o=r /home/test1 主用户组,即id命令显示的g ...

  5. linux php preg扩展,PHP_linux shell 正则表达式(BREs,EREs,PREs)差异比较,在计算机科学中,是指一个用 - phpStudy...

    linux shell 正则表达式(BREs,EREs,PREs)差异比较 在计算机科学中,是指一个用来描述或者匹配一系列符合某个句法规则的字符串的单个字符串.在很多文本编辑器或其他工具里,正则表达式 ...

  6. linux pts设备,Linux中tty和pts指的是什么

    Linux中tty和pts指的是什么 发布时间:2020-11-17 14:55:05 来源:亿速云 阅读:135 作者:小新 这篇文章将为大家详细讲解有关Linux中tty和pts指的是什么,小编觉 ...

  7. linux重命名得通配符,在Linux中如何一次重命名多个文件详解

    前言 在日常工作中,我们经常需要对一批文件进行重命名操作,例如将所有的jpg文件改成bnp,将名字中的1改成one,等等. 你可能已经知道,我们使用 mv 命令在类 Unix 操作系统中重命名或者移动 ...

  8. Android adb命令,linux中各种命令

    常用的ADB命令 1. 显示系统中全部Android平台: android list targets 2. 显示系统中全部AVD(模拟器): android list avd 3. 创建AVD(模拟器 ...

  9. 【Linux】Linux中正则表达式

    当从一个文件或命令输出中抽取或过滤文本时,可以使用正则表达式. 以下是在基本命令中使用正则表达式的一些定义及用法 基本元字符集及其含义 ^ 匹配行首 $ 匹配行尾 . 匹配任意单个字符 * 字符*   ...

  10. 如何在Linux中使用ulimit命令

    The ulimit command in Linux is an extremely useful command for system admins who manage multi-user s ...

最新文章

  1. 一篇对伪共享、缓存行填充和CPU缓存讲的很透彻的文章
  2. RedHat Satellite 弃 MongoDB ,全面改用 PostgreSQL
  3. 英特尔多核联合实验室授牌仪式
  4. Eclipse快捷键大全(同样适用基于Eclipse开发的IDE)
  5. 制作内网yum源 同步阿里的源
  6. 078、Docker 最常用的监控方案(2019-04-25 周四)
  7. LOJ2257 SNOI2017 遗失的答案 容斥、高维前缀和
  8. 不同vlan之间如何ping通_如何利用交换机实现不同VLAN、不同网段之间互访?
  9. 杨辉三角的几种 Python 实现方法
  10. 计算机软硬件的组成及主要技术指标,计算机软硬件系统的组成及主要技术指标...
  11. word-embedding(skip-gram)(pytorch入门3)
  12. Android基本组件及使用
  13. LTE与VOLTE基础知识(1)
  14. MapGuide空间参考系API
  15. 可视化随笔 阶梯图
  16. 第二十章 Unity 渲染管线
  17. 现代浏览器的web音频javascript类库 - Howler.js
  18. 发挥GPU强大动力的CG语言
  19. excel数据的导出
  20. 【兴趣书签】SOHO生活——理想的生活方式

热门文章

  1. 讯飞输入法pad版x86_讯飞输入法Pad版
  2. 一文打尽PHP代码加密方式
  3. Win11 系统安装事项,跳过微软账户登录,VMWare安装Win11
  4. 直击DTCC2018 阿里数据库技术干货全面解析
  5. java 文件上传(使用多线程)
  6. 注意力测试软件系统,注意力评估训练系统
  7. abp vnext数据库迁移(新建库)
  8. 怎么给word文档注音_如何给Word文档中的汉字加拼音?一键加拼音超级方便
  9. 天池大数据竞赛平台-东电网智慧现场作业挑战赛:识别高空作业及安全带佩戴Baseline(非官方)
  10. [CGAL] CGAL的编译与使用