$(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 ...

相关内容