Qual é a diferença entre $(CC) e $CC?

Qual é a diferença entre $(CC) e $CC?

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 $CCisso 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 $CCcontrário seria expandida para o valor da variável Cseguida por um literal C( $CCseria na verdade o mesmo que $(C)Cem 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 $CCna 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 CCe anexa a string _helloao 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 $CCse 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 ...

informação relacionada