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

これが私が見つけたものですが、同じドキュメントで理解できません

二次拡張を有効にしていて、前提条件リストに文字通りのドル記号が必要な場合は、実際には 4 つのドル記号 ('$$$$') を記述する必要があります。

4 つのドル記号 "$$$$" は実際には何を意味するのだろうか? 18449、18444、または 18439 はどのように行われますか?

よろしくお願いします!

4

3 に答える 3

25

「二次展開」が有効な場合、実際の出力で$$$$シングルを生成するために必要です。は通常、変数の展開、make 関数の呼び出しなどに使用され、二次展開が有効になっていると何か他のことを行いますが、それ以外の場合は出力に actual を生成します。$$$$$

Unix ライクなシステムでコマンド ラインを実行するために make が使用するシェルは、通常$$、シェル プロセス ID への展開として解釈します。したがって、二次拡張を有効にしないと、シェルがプロセス ID に展開する出力に$$$$変わります。$$

(シェル プロセス ID をサフィックスとして使用することは、一時ファイルのファイル名の一意性を保証しようとする簡単な方法です。)

于 2009-08-24T02:37:50.857 に答える
19

$$に変換されますが、Makefile ルール (シェル式) では、式を単一引用符で囲むか、または使用して$、結果をエスケープする必要もあります。$\'

これを示す例を次に示します。

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 に答える