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, $CC
funciona. 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 $CC
de lo contrario se expandiría al valor de la variable C
seguido de un literal C
( $CC
en efecto, sería lo mismo que $(C)C
en 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 $CC
en 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 CC
y agrega la cadena _hello
a 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 $CC
si 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
, $foo
se 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 ...