$(CC) 和 $CC 有什么区别?

tan*_*ect 6 linux bash

我正在尝试使用 yocto poky 环境。我做了以下事情:

#source environment-setup-cortexa9hf-neon-poky-linux-gnueabi 
Run Code Online (Sandbox Code Playgroud)

现在,如果我尝试使用以下方法编译程序:

#$(CC) hello.c -o hello.elf 
Run Code Online (Sandbox Code Playgroud)

由于$(CC)未定义,它会引发我的错误。

但是,如果我这样做的$CC话。我对 $(CC) 和$CC?

Kus*_*nda 18

我假设您已经$(CC)在 Makefile 中看到它用作变量的扩展,该变量CC通常包含 C 编译器的名称。$(...)每当扩展具有多字符名称的变量时,都会使用 Makefile 中变量扩展的语法,$CC否则将扩展为变量的值C后跟一个文字C$CC实际上与$(C)CMakefile 中的相同)。

但是在 shell 中,由于具有不同的语法,$(CC)是一个命令替换,它将被运行命令的输出替换CC。如果您的系统上没有这样的命令,您会看到“找不到命令”错误。

您也有可能误认为在 shell 中,在大多数情况下$(CC)${CC}which 是等效的$CC。仅当变量的扩展后紧跟一些其他字符串时才需要花括号,否则这些字符串将被解释为变量名称的一部分。差异的一个例子可以在"$CC_hello"(扩展名为 的变量CC_hello)和"${CC}_hello"(扩展变量CC并将字符串附加_hello到其值中)中看到。在所有其他情况下,${CC}等价于$CC。注意,使用大括号是不是引用的扩张,即${CC}一样的"$CC"

如果有一个 shell 或环境变量保存您用于编译 C 代码的编译器的名称,并且您想在命令行上使用该变量,则使用"$CC", 或者仅$CC当变量的值不包含空格或 shell 时通配符。

$CC -o hello.elf hello.c
Run Code Online (Sandbox Code Playgroud)

  • 当然,根据它的*性质*,你不知道`$CC` 的扩展中是否会有空格,所以你几乎总是想要`"$CC"`。 (2认同)