我正在嘗試使用 yocto poky 環境。我做了以下事情:
#source environment-setup-cortexa9hf-neon-poky-linux-gnueabi
現在,如果我嘗試使用以下命令編譯程式:
#$(CC) hello.c -o hello.elf
$(CC)
由於未定義,它會引發錯誤。
但是,如果我$CC
這樣做,它就會起作用。我對 $(CC) 和 之間的根本區別是什麼感到困惑$CC
?
答案1
我假設您$(CC)
在 Makefile 中看到它充當變數的擴展CC
,該變數通常保存 C 編譯器的名稱。$(...)
每當擴展具有多字元名稱的變數時,都會使用 Makefile 中的變數擴展語法,否則將擴展為後跟文字的$CC
變數值(實際上與Makefile 中的相同)。C
C
$CC
$(C)C
但在 shell 中,由於語法不同,$(CC)
命令替換將被運行命令的輸出取代CC
。如果您的系統上沒有此類命令,您將看到“找不到命令”錯誤。
您也可能誤認為$(CC)
,${CC}
在 shell 中, 相當於$CC
在大多數情況下。僅當遵循變數擴展時才需要花括號立即地由其他一些字串組成,否則這些字串將被解釋為變數名稱的一部分。差異的範例可以在"$CC_hello"
(展開名為 的變數CC_hello
) 和"${CC}_hello"
(展開變數CC
並將字串附加_hello
到其值) 中看到。在所有其他情況下,${CC}
相當於$CC
。請注意,使用花括號是不是引用展開式,${CC}
即不是與 相同"$CC"
。
如果有一個 shell 或環境變量保存您用於編譯 C 程式碼的編譯器的名稱,並且您想在命令列上使用該變量,則使用"$CC"
, 或僅$CC
在該變量的值不包含空格或 shell 時使用通配字元。
$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 ...