¿Cuál es la diferencia entre $(CC) y $CC?

¿Cuál es la diferencia entre $(CC) y $CC?

Estoy intentando utilizar el entorno yocto poky. Hice lo siguiente:

#source environment-setup-cortexa9hf-neon-poky-linux-gnueabi 

Ahora, si intento compilar el programa usando:

#$(CC) hello.c -o hello.elf 

me tira error ya que $(CC)no está definido.

Sin embargo, si lo hago, $CCfunciona. Estoy confundido sobre cuál es la diferencia fundamental entre $(CC) y $CC?

Respuesta1

Supongo que lo has visto $(CC)en un Makefile donde sirve como una expansión de la variable CC, que normalmente contiene el nombre del compilador de C. La $(...)sintaxis para expansiones de variables en Makefiles se usa siempre que se expande una variable con un nombre de varios caracteres, ya que $CCde lo contrario se expandiría al valor de la variable Cseguido de un literal C( $CCen efecto, sería lo mismo que $(C)Cen un Makefile).

Sin embargo, en el shell, debido a que tiene una sintaxis diferente, $(CC)hay una sustitución de comando que sería reemplazada por el resultado de ejecutar el comando CC. Si no existe tal comando en su sistema, verá el error "comando no encontrado".

También es posible que te hayas confundido $(CC)con ${CC}lo que, en el shell, equivale a $CCen la mayoría de las circunstancias. Las llaves sólo son necesarias si se sigue la expansión de la variableinmediatamentepor alguna otra cadena que de otro modo se interpretaría como parte del nombre de la variable. Un ejemplo de la diferencia se puede ver en "$CC_hello"(expande la variable llamada CC_hello) y "${CC}_hello"(expande la variable CCy agrega la cadena _helloa su valor). En todas las demás circunstancias, ${CC}equivale a $CC. Tenga en cuenta que usar llaves esnocitando la expansión, es decir, ${CC}esnolo mismo que "$CC".

Si tiene un shell o una variable de entorno que contiene el nombre del compilador que está usando para compilar el código C y desea usar esa variable en la línea de comando, entonces use "$CC", o simplemente $CCsi el valor de la variable no contiene espacios o shell personajes globulares.

$CC -o hello.elf hello.c

Respuesta2

Los dos no son equivalentes. En una línea que contiene $(foo), $(foo)se reemplaza con la salida del comando foo. Por ejemplo:

$ echo "hello $(echo world)"
hello world

En una línea que contiene $foo, $foose reemplaza con el valor de la variable denominada foo. Por ejemplo:


$ foo=world
$ echo "hello $foo"
hello world

Respuesta3

Esta respuesta no considera la sintaxis del archivo MAKE.

"$(CC)"es la salida del comando CC.

"$CC"es el valor de la variable CC.

Esto debería dejar clara la diferencia:

$ CC=ls
$ echo $(CC)
CC: command not found
$ echo $CC
ls

y

$ echo $($CC)
bin   cdrom  dev  home        initrd.img.old  lost+found  mnt  proc  run ...

información relacionada