25

我正在阅读 GNU Make 的文档。这是一个例子

%.d: %.c

    @set -e; rm -f $@; \

     $(CC) -M $(CPPFLAGS) $< > $@.$$$$; \

     sed ’s,\($*\)\.o[ :]*,\1.o $@ : ,g’ < $@.$$$$ > $@; \

     rm -f $@.$$$$

我在一个 C++ 程序上试过这个,并得到了文件列表

init3d.d init3d.d.18449 input.d input.d.18444 main.d main.d.18439

这是我在同一个文档中发现但不理解的内容

如果您启用了二级扩展并且您希望在先决条件列表中使用文字美元符号,则您必须实际编写四个美元符号('$$$$')。

我想知道四个美元符号“$$$$”实际上是什么意思?他们如何 18449、18444 或 18439?

谢谢并恭祝安康!

4

3 回答 3

25

如果启用“二次扩展”,则需要在实际输出中$$$$生成单个。通常用于扩展变量、调用 make 函数等,启用辅助扩展会做其他事情,但否则会在输出中生成实际值。$$$$$

用于在类 Unix 系统上执行命令行的 shell 通常解释$$为扩展为 shell 进程 ID。因此,在没有启用二级扩展的情况下,$$$$$$在输出中变为,shell 将扩展为进程 ID。

(使用 shell 进程 ID 作为后缀是一种尝试保证临时文件的文件名唯一性的简单方法。)

于 2009-08-24T02:37:50.857 回答
19

$$将转换为$,但在 Makefile 规则(它们是 shell 表达式)中,您还必须$使用 a\或在表达式周围使用单引号来转义结果'

这是一个演示它的示例:

DOLLAR:=$$
dollar:
    echo '$$'  >  $@
    echo "\$$" >> $@
    echo '$(DOLLAR)'  >> $@
    echo "\$(DOLLAR)" >> $@
    cat dollar
于 2012-03-06T15:28:31.420 回答
2

18449、18444 或 18439 看起来像进程 ID,所以可能是进程 ID?

于 2009-08-24T02:36:25.993 回答