makefile小记

简介:

通过Ubuntu Makefile总结而得

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
#######make file
#make支持三个通配符:“*”,“?”和“~”。
include .. /src/Makefile
 
VPATH = src:.. /headers     // 文件搜索
{
     1、vpath <pattern> <directories>     :为符合模式<pattern>的文件指定搜索目录<directories>。
     2、vpath <pattern>                     :清除符合模式<pattern>的文件的搜索目录。
     3、vpath                             :清除所有已被设置好了的文件搜索目录。 
}
 
伪目标一般没有依赖的文件。但是,我们也可以为伪目标指定所依赖的文件:.PHONY=all
伪目标同样可以作为“默认目标”,只要将其放在第一个。
将目标放到第一个,即做为“默认目标”时, make  不带参数时,生成的将只有默认目标
 
{
     静态模式可以更加容易地定义多目标的规则,可以让我们的规则变得更加的有弹性和灵活。我们还是先来看一下语法:
     <targets ...>: <target-pattern>: <prereq-patterns ...>
         <commands>
     targets定义了一系列的目标文件,可以有通配符。是目标的一个集合。
     target-pattern是指明了targets的模式,也就是的目标集模式。
     prereq-patterns是目标的依赖模式,它对target-pattern形成的模式再进行一次依赖目标的定义。
     其中把targets去掉就是隐藏规则
 
}
 
{
     常用的隐含规则
     1、编译C程序的隐含规则。
     “.o”的目标的依赖目标会自动推导为“.c”,并且其生成命令是“$(CC) –c $(CPPFLAGS) $(CFLAGS)”
     2、编译C++程序的隐含规则。
     “.o”的目标的依赖目标会自动推导为“.cc”或是“.C”,
     并且其生成命令是 “$(CXX) –c $(CPPFLAGS) $(CFLAGS)”。(建议使用“.cc”作为C++源文件的后缀,而不是“.C”) 
     7、汇编和汇编预处理的隐含规则。
     “.o” 的目标的依赖目标会自动推导为“.s”,默认使用编译器“as”,
     并且其生成命令是:“$(AS) $(ASFLAGS)”。“.s” 的目标的依赖目标会自动推导为“.S”,
     默认使用C预编译器 “cpp”,并且其生成命令是:“$(AS) $(ASFLAGS)”。
     8、链接Object文件的隐含规则。
     目标依赖于“.o”,通过运行C的编译器来运行链接程序生成(一般是“ld”),
     其生成命令是: “$(CC) $(LDFLAGS) .o $(LOADLIBES) $(LDLIBS)”。
     这个规则对于只有一个源文件的工程有效,同时也对多个Object文件(由不同的源文件生成)的也有效。
}
 
 
{
     你可以使用模式规则来定义一个隐含规则。
     模式规则中,至少在规则的目标定义中要包含 "%" ,否则,就是一般的规则。
}
下面是所有的自动化变量及其说明:
 
$@
     表示规则中的目标文件集。在模式规则中,如果有多个目标,那么, "$@" 就是匹配于目标中模式定义的集合。 
 
$%
     仅当目标是函数库文件中,表示规则中的目标成员名。例如,如果一个目标是 "foo.a(bar.o)"
     那么, "$%" 就是  "bar.o" "$@" 就是 "foo.a" 。如果目标不是函数库文件(Unix下是[.a],Windows下是[.lib]),
     那么,其值为空。 
 
$< 
     依赖目标中的第一个目标名字。如果依赖目标是以模式(即 "%" )定义的,
     那么 "$<" 将是符合模式的一系列的文件集。注意,其是一个一个取出来的。 
$?
     所有比目标新的依赖目标的集合。以空格分隔。 
 
$^
     所有的依赖目标的集合。以空格分隔。如果在依赖目标中有多个重复的,
     那个这个变量会去除重复的依赖目标,只保留一份。 
 
$+
     这个变量很像 "$^" ,也是所有依赖目标的集合。只是它不去除重复的依赖目标。 
 
$*
     这个变量表示目标模式中 "%" 及其之前的部分。如果目标是 "dir/a.foo.b"
     并且目标的模式是 "a.%.b" ,那么, "$*" 的值就是 "dir/a.foo" 。这个变量对于构造有关联的文件名是比较有较。
     如果目标中没有模式的定义,那么 "$*" 也就不能被推导出,但是,如果目标文件的后缀是 make 所识别的,
     那么 "$*" 就是除了后缀的那一部分。例如:如果目标是 "foo.c"
     因为 ".c" make 所能识别的后缀名,所以, " $*" 的值就是 "foo"
     这个特性是GNU  make 的,很有可能不兼容于其它版本的 make ,所以,
     你应该尽量避免使用 "$*" ,除非是在隐含规则或是静态模式中。
     如果目标中的后缀是 make 所不能识别的,那么 "$*" 就是空值。









本文转自 hakuyo 51CTO博客,原文链接:http://blog.51cto.com/hakuyo/1660107,如需转载请自行联系原作者

目录
相关文章
1.10~1.12 Makefile
1.10~1.12 Makefile
83 0
1.10~1.12 Makefile
|
C语言
makefile中伪目标的理解
1. 我们知道Makefile中的语法是这样: target ... : prerequisites ... command … …   2. 假如编译两个文件可以这么写: a.o:a.c  gcc -c a.c b.o:b.c  gcc -c b.c Test: a.o b.o   gcc -o Test a.o b.oclean:  rm *.o 我们可以单独这么运行:make a.o或者make b.o或者make clean注意上面三个的区别。
1224 0