首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >$(CC)和$CC之间有什么区别?

$(CC)和$CC之间有什么区别?
EN

Unix & Linux用户
提问于 2020-03-18 02:32:15
回答 3查看 3.7K关注 0票数 6

我在尝试使用yocto的环境。我做了以下工作:

代码语言:javascript
复制
#source environment-setup-cortexa9hf-neon-poky-linux-gnueabi 

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

代码语言:javascript
复制
#$(CC) hello.c -o hello.elf 

因为没有定义$(CC),所以它会抛出错误。

但是,如果我做了$CC,它就能工作。我搞不懂$(CC)和$CC之间的根本区别是什么?

EN

回答 3

Unix & Linux用户

回答已采纳

发布于 2020-03-18 07:42:29

我假设您已经在Makefile中看到了$(CC),它充当变量CC的扩展,该变量通常具有C编译器的名称。Makefiles中变量扩展的$(...)语法在扩展具有多字符名称的变量时使用,因为否则$CC将扩展为变量C的值,然后是文字C ($CC实际上与Makefile中的$(C)C相同)。

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

您还可能将$(CC)误认为是${CC},在大多数情况下,它在外壳中等同于$CC。只有当变量的展开后面紧跟其他字符串时才需要大括号,否则该字符串将被解释为变量名称的一部分。在"$CC_hello" (扩展名为CC_hello的变量)和"${CC}_hello" (扩展变量CC并将字符串_hello附加到其值)中可以看到这种差异的一个例子。在所有其他情况下,${CC}等同于$CC。请注意,使用大括号并不引用扩展,即${CC}"$CC"不相同。

如果有一个shell或环境变量保存用于编译C代码的编译器的名称,并且希望在命令行上使用该变量,则使用"$CC",如果变量的值不包含空格或shell全局字符,则只使用$CC

代码语言:javascript
复制
$CC -o hello.elf hello.c
票数 18
EN

Unix & Linux用户

发布于 2020-03-18 02:41:39

两者是不对等的。在包含$(foo)的行中,$(foo)被替换为命令foo的输出。例如:

代码语言:javascript
复制
$ echo "hello $(echo world)"
hello world

在包含$foo的行中,$foo被替换为名为foo的变量的值。例如:

代码语言:javascript
复制
$ foo=world
$ echo "hello $foo"
hello world
票数 4
EN

Unix & Linux用户

发布于 2020-03-18 15:36:03

这个答案没有考虑makefile语法。

"$(CC)"是命令CC的输出。

"$CC"是变量CC的值。

这应使差别变得清楚:

代码语言:javascript
复制
$ CC=ls
$ echo $(CC)
CC: command not found
$ echo $CC
ls

代码语言:javascript
复制
$ echo $($CC)
bin   cdrom  dev  home        initrd.img.old  lost+found  mnt  proc  run ...
票数 1
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/573508

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档