$(CC)
を見たことがあると思います 変数 CC
の展開として機能する Makefile 内 、通常は C コンパイラの名前を保持します。 $(...)
$CC
のように、複数文字の名前を持つ変数が展開されるたびに、Makefile の変数展開の構文が使用されます。 そうでなければ、変数 C
の値に展開されます その後にリテラル C
が続きます ($CC
実際には $(C)C
と同じです
ただし、シェルでは、構文が異なるため、 $(CC)
コマンド CC
を実行した場合の出力に置き換えられるコマンド置換です。 .システムにそのようなコマンドがない場合、「コマンドが見つかりません」というエラーが表示されます。
$(CC)
を間違えた可能性もあります ${CC}
の場合 これは、シェルでは $CC
と同等です ほとんどの状況で。中括弧は、変数の展開がすぐに続く場合にのみ必要です。 そうでなければ、変数の名前の一部として解釈される他の文字列によって。違いの例は "$CC_hello"
にあります (CC_hello
という変数を展開します ) と "${CC}_hello"
(変数 CC
を展開します 文字列 _hello
を追加します その値に)。その他のすべての状況では、${CC}
$CC
と同等です .中括弧の使用はしないことに注意してください 展開を引用する、つまり ${CC}
ではない "$CC"
と同じ .
C コードのコンパイルに使用しているコンパイラの名前を保持するシェルまたは環境変数があり、その変数をコマンド ラインで使用する場合は、"$CC"
を使用します。 、または単に $CC
変数の値にスペースやシェル グロビング文字が含まれていない場合。
$CC -o hello.elf hello.c
2つは同等ではありません。 $(foo)
を含む行 、$(foo)
コマンド foo
の出力に置き換えられます .例:
$ echo "hello $(echo world)"
hello world
$foo
を含む行 、$foo
foo
という名前の変数の値に置き換えられます .例:
$ foo=world
$ echo "hello $foo"
hello world