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中第一个目标中没有通配符的目标进行构造,所以步骤是:

  1. 构造all,发现需要test1.o和test2.o
  2. 这个时候他就会在Makefile文件中找到目标能匹配test1.o和test2.o的规则。
  3. 找到test1.o的规则并且知道test1.c存在,运行下面的命令。
  4. 同步骤三构造出test2.o
  5. 现在构造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



转载本文请保留以下网址:http://www.cnblogs.com/warren-wong/p/3979270.html 

如果发现文中有错误之处,请务必告诉我,谢谢大家。

时间: 2024-11-05 16:30:46

Makefile中的%标记和系统通配符*的区别的相关文章

makefile 中 [email&#160;protected] $^ %&lt; 使用

这篇文章介绍在LINUX下进行C语言编程所需要的基础知识.在这篇文章当中,我们将会学到以下内容: 源程序编译 Makefile的编写 程序库的链接 程序的调试 头文件和系统求助 1.源程序的编译 在Linux下面,如果要编译一个C语言源程序,我们要使用GNU的gcc编译器. 下面我们以一个实例来说明如何使用gcc编译器. 假设我们有下面一个非常简单的源程序(hello.c): int main(int argc,char **argv) { printf("Hello Linux\n"

Word 2003中编辑标记与格式标记大讨论

问题 Word 2003中编辑标记与格式标记是不是一回事? 我花费了很多时间在网络上查询,看到有一个论坛上有一个提到,这两个说法是一回事.更奇怪的是,不少WORD大师级人物,也没有解释好这两个说法. 我在WORD 2003帮助系统下输入搜索关键字"编辑标记",得到的结论如下: 显示或隐藏格式标记 单击"常用"工具栏上的"显示/隐藏编辑标记" . 提示 通过单击"工具"菜单上的"选项",再单击"视图

转: 静态模式makefile中$(cobjs): $(obj)/%.o: $(src)/%.c

4.12 静态模式静态模式规则是这样一个规则:规则存在多个目标,并且不同的目标可以根据目标文件的名字来自动构造出依赖文件.静态模式规则比多目标规则更通用,它不需要多个目标具有相同的依赖.但是静态模式规则中的依赖文件必须是相类似的而不是完全相同的.4.12.1静态模式规则的语法首先,我们来看一下静态模式规则的基本语法:TARGETS ...: TARGET-PATTERN: PREREQ-PATTERNS ...COMMANDS..."TAGETS"列出了此规则的一系列目标文件.像普通规

makefile中的自动化变量[email&#160;protected],$%,$

转自:http://www.2cto.com/os/201302/191344.html 自动化变量 模式规则中,规则的目标和依赖文件名代表了一类文件名:规则的命令是对所有这 一类文件重建过程的描述,显然,在命令中不能出现具体的文件名,否则模式规则失去 意义.那么在模式规则的命令行中该如何表示文件,将是本小节的讨论的重点. 假如你需要书写一个将.c 文件编译到.o 文件的模式规则,那么你该如何为gcc 书写 正确的源文件名?当然了,不能使用任何具体的文件名,因为在每一次执行模式规则时 源文件名都

makefile中的shell编程注意点

参考:http://blog.csdn.net/wanglang3081/article/details/49423105 (1)Makefile本质上来讲也是shell脚本,即每条command都是shell进程,运行完shell进程都会退出.   (2)shell代码行,如果有=的话,=两边不能有空格   (3)Makefile中的shell,每一行是一个进程,不同行之间变量值不能传递.所以,Makefile中的shell不管多长也要写在一行.可以用\来分行写,格式更清晰一点. SUBDIR

Makefile中wildcard的介绍

在Makefile规则中,通配符会被自动展开.但在变量的定义和函数引用时,通配符将失效.这种情况下如果需要通配符有效,就需要使用函数“wildcard”,它的用法是:$(wildcard PATTERN...) .在Makefile中,它被展开为已经存在的.使用空格分开的.匹配此模式的所有文件列表.如果不存在任何符合此模式的文件,函数会忽略模式字符并返回空.需要注意的是:这种情况下规则中通配符的展开和上一小节匹配通配符的区别. 一般我们可以使用“$(wildcard *.c)”来获取工作目录下的

VS报:&quot;dll标记为系统必备组件,必须对其进行强签名&quot;错误

问题: VS生成程序时,报“要将程序集“XX.dll”标记为系统必备组件,必须对其进行强签名.”错误. 解决方法: 1)在报错的解决方案中找到一个可以发布的项目(引用该XX.dll的项目未必可以发布): 2)右击该项目,选择“属性”: 3)选择“发布”: 4)点击“应用程序文件”按钮: 5)找到该“XX.dll”,将发布状态有“系统必备”改为“包括(自动)”: 6)再次运行成功. 参考: 1. 首先说明一下:X是某程序集的名称,相当于数学中的未知数X. 看到这样的提示,开始我以为是把程序集X的发

Makefile 中的常用函数

1.$(subset <from>,<to>,<text>) 名称:字符串替换 功能:把字符串<text>中得<from>字符串替换成<to> 返回值:返回被替换过后的字符串 示例: $(subst ee,EE,feet on the street) 把"feet on the street"中的"ee"替换成"EE",返回结果是"fEEt on the strEE

makefile 中 [email&#160;protected] $^ %&lt; 使用【转】

转自:http://blog.csdn.net/kesaihao862/article/details/7332528 这篇文章介绍在LINUX下进行C语言编程所需要的基础知识.在这篇文章当中,我们将会学到以下内容: 源程序编译 Makefile的编写 程序库的链接 程序的调试 头文件和系统求助 1.源程序的编译 在Linux下面,如果要编译一个C语言源程序,我们要使用GNU的gcc编译器. 下面我们以一个实例来说明如何使用gcc编译器. 假设我们有下面一个非常简单的源程序(hello.c):