Estou tentando usar o ambiente yocto poky. Eu fiz o seguinte:
#source environment-setup-cortexa9hf-neon-poky-linux-gnueabi
Agora, se eu tentar compilar o programa usando:
#$(CC) hello.c -o hello.elf
isso me gera um erro, pois $(CC)
não está definido.
No entanto, se eu fizer $CC
isso funciona. Estou confuso sobre qual é a diferença fundamental entre $(CC) e $CC
?
Responder1
Presumo que você já tenha visto $(CC)
em um Makefile onde ele serve como uma expansão da variável CC
, que normalmente contém o nome do compilador C. A $(...)
sintaxe para expansões de variáveis em Makefiles é usada sempre que uma variável com um nome de vários caracteres é expandida, caso $CC
contrário seria expandida para o valor da variável C
seguida por um literal C
( $CC
seria na verdade o mesmo que $(C)C
em um Makefile).
Porém, no shell, por ter uma sintaxe diferente, $(CC)
há uma substituição de comando que seria substituída pela saída da execução do comando CC
. Se não existir tal comando em seu sistema, você verá um erro “comando não encontrado”.
Também é possível que você tenha confundido $(CC)
which ${CC}
, no shell, é equivalente a $CC
na maioria das circunstâncias. As chaves só são necessárias se a expansão da variável for seguidaimediatamentepor alguma outra string que de outra forma seria interpretada como parte do nome da variável. Um exemplo da diferença pode ser visto em "$CC_hello"
(expande a variável chamada CC_hello
) e "${CC}_hello"
(expande a variável CC
e anexa a string _hello
ao seu valor). Em todas as outras circunstâncias, ${CC}
é equivalente a $CC
. Observe que usar chaves énãocitando a expansão, ou seja, ${CC}
énãoo mesmo que "$CC"
.
Se tiver um shell ou variável de ambiente contendo o nome do compilador que você está usando para compilar o código C e quiser usar essa variável na linha de comando, use "$CC"
, ou apenas $CC
se o valor da variável não contiver espaços ou shell personagens globulantes.
$CC -o hello.elf hello.c
Responder2
Os dois não são equivalentes. Em uma linha que contém $(foo)
, o $(foo)
é substituído pela saída do comando foo
. Por exemplo:
$ echo "hello $(echo world)"
hello world
Em uma linha que contém $foo
, o $foo
é substituído pelo valor da variável chamada foo
. Por exemplo:
$ foo=world
$ echo "hello $foo"
hello world
Responder3
Esta resposta não considera a sintaxe do makefile.
"$(CC)"
é a saída do comando CC
.
"$CC"
é o valor da variável CC
.
Isso deve deixar a diferença clara:
$ CC=ls
$ echo $(CC)
CC: command not found
$ echo $CC
ls
e
$ echo $($CC)
bin cdrom dev home initrd.img.old lost+found mnt proc run ...