我正在尝试使用 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 ...