$(CC) 和 $CC 有什麼區別?

$(CC) 和 $CC 有什麼區別?

我正在嘗試使用 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 中的相同)。CC$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 ...

相關內容