yocto poky環境を使用しようとしています。私は次のことをしました。
#source environment-setup-cortexa9hf-neon-poky-linux-gnueabi
ここで、次のようにプログラムをコンパイルしようとすると:
#$(CC) hello.c -o hello.elf
$(CC)
定義されていないため、エラーが発生します。
しかし、これは$CC
効果があります。 $(CC) と$CC
?の根本的な違いは何か混乱しています。
答え1
通常、Cコンパイラの名前を保持する$(CC)
変数の拡張として機能するMakefilesでこれを見たことがあるとします。複数文字名の変数が拡張されるたびに、Makefileの変数拡張構文が使用されます。それ以外の場合は、リテラルは後続の変数値に展開されます(実際にはMakefileと同じ)。CC
$(...)
$CC
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
答え3
この答えはmakefileの構文を考慮しません。
"$(CC)"
コマンドの出力ですCC
。
"$CC"
変数の値ですCC
。
これは違いを明確に示しています。
$ CC=ls
$ echo $(CC)
CC: command not found
$ echo $CC
ls
そして
$ echo $($CC)
bin cdrom dev home initrd.img.old lost+found mnt proc run ...