曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 5251|回复: 0
打印 上一主题 下一主题

$+,$*,$(@D),$(@F),$(*D),$(*F),$(%D),$(%F),$(%D),$(%F),$(<D),$(<F),$(^D)

[复制链接]

4918

主题

5880

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34397
跳转到指定楼层
楼主
发表于 2011-7-1 17:44:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
$+
$^ 表示所有依赖文件列表。一个文件可重复出现在目标的依赖中,$^ 只记录它的一次引用情况,也就是说 $^ 会去掉重复的依赖文件。$+ 类似于 $^,但它保留了依赖文件中重复出现的文件。下面举例说明这两个变量的区别。

先在一个目录下建立  3 个文件:
$ echo "are" > test1.txt
$ echo "you" > test2.txt
$ echo "ok" > test3.txt

测试代码
[code=Makefile]all:test1.txt test2.txt test3.txt test1.txt
    $(shell cat $^ > integra1)
    $(shell cat $+ > integra2)
[/mw_shl_code]
运行输出
beyes@debian:~/Makefile/prereq$ cat integra1
are
you
ok
beyes@debian:~/Makefile/prereq$ cat integra2
are
you
ok
are
由输出可以很清楚的看到这两个变量的区别。

$*
$* 有一个形象的词来称呼它 --- “茎” 。如果目标文件名中带有一个可识别的后缀,那么 $* 就表示文件中移除后缀以外的部分。比如 main.o 作为目标时,$* 就表示为 main 。如果目标包含不可识别的后缀时,该变量为空。

$(@D)
代表目标文件的目录部分(要去掉目录部分的最后一个斜杠),如下例所示:
[code=Makefile]/home/beyes/Makefile/main.o:
    @echo $(@D)[/mw_shl_code]
运行输出:
$ make
/home/beyes/Makefile
如果目标中不包含斜杠,那么输出值为 '.' 表示当前目录。

$(@F)
目标文件的完整文件名初目录以外的部分,换句话说表示的是实际的文件名。如下示例:
[code=Makefile]/home/beyes/Makefile/main.o:
    @echo $(@F)[/mw_shl_code]
运行输出:
$ make
main.o

$(*D) 和 $(*F)
分别表示目标 “茎” 中的目录部分和文件名部分。如下示例:
[code=Makefile]/home/beyes/Makefile/main.o:
    @echo $(*D)
    @echo $(*F)[/mw_shl_code]
运行输出:
$ make
/home/beyes/Makefile
main

$(%D) 和 $(%F)
当以 "archive(member)" 这样形式的静态库为目标时,分别表示库文件成员 "member" 名中的目录部分和文件名部分。它仅对这种形式的规则目标有效。如下示例:
[code=Makefile]Mylib.a(/home/beyes/main/are.o):
    @echo $(%D)
    @echo $(%F)[/mw_shl_code]
运行输出:
$ make
/home/beyes/main
are.o

$(<D) 和 $(<F)
分别表示规则中第一个依赖文件的目录部分和文件名部分。如下示例:
[code=Makefile]/home/beyes/main/are.o:
    @echo hello

something.o:
    @echo makefile

all:/home/beyes/main/are.o something.o
    @echo $(<D)
    @echo $(<F)[/mw_shl_code]
运行输出:
$ make all
hello
makefile
/home/beyes/main
are.o

$(^D) 和 $(^F)
分别表示所有依赖文件的目录部分和文件部分(不存在同一文件)。如下示例:
/home/beyes/main/are.o:
    @echo hello

/home/beyes/something.o:
    @echo makefile

all:/home/beyes/main/are.o /home/beyes/something.o
    @echo $(^D)
    @echo $(^F)
运行输出:
$ make all
hello
makefile
/home/beyes/main /home/beyes
are.o something.o

$(+D) 和 $(+F)
分别表示所有依赖文件的目录部分和文件部分(可存在重复文件)。

$(?D) 和 $(?F)
分别表示被更新的依赖文件的目录部分和问及文件部分。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2025-6-17 15:26 , Processed in 0.067210 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表