В чем разница между $(CC) и $CC?

В чем разница между $(CC) и $CC?

Я пытаюсь использовать среду yocto poky. Я сделал следующее:

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

Теперь, если я попытаюсь скомпилировать программу с помощью:

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

он выдает мне ошибку, так как $(CC)не определен.

Однако, если я $CCэто сделаю, то это сработает. Я не понимаю, в чем принципиальное различие между $(CC) и $CC?

решение1

Я предполагаю, что вы видели $(CC)в Makefile, где он служит расширением переменной CC, которая обычно содержит имя компилятора C. Синтаксис $(...)для расширения переменных в Makefile используется всякий раз, когда расширяется переменная с многосимвольным именем, поскольку $CCв противном случае расширялось бы до значения переменной, Cза которым следует литерал C( $CCпо сути, было бы таким же, как $(C)Cв Makefile).

Однако в оболочке, из-за другого синтаксиса, $(CC)есть подстановка команды, которая будет заменена выводом выполнения команды CC. Если в вашей системе нет такой команды, вы увидите ошибку «команда не найдена».

Также возможно, что вы перепутали , $(CC)что ${CC}в оболочке эквивалентно $CCв большинстве случаев. Фигурные скобки нужны только в том случае, если следует расширение переменнойнемедленнокакой-либо другой строкой, которая в противном случае была бы интерпретирована как часть имени переменной. Примером разницы может служить "$CC_hello"(разворачивает переменную с именем CC_hello) и "${CC}_hello"(разворачивает переменную CCи добавляет строку _helloк ее значению). Во всех других случаях ${CC}эквивалентно $CC. Обратите внимание, что использование фигурных скобокнетцитируя расширение, ${CC}т.е.неттакой же как "$CC".

Если у вас есть переменная оболочки или окружения, содержащая имя компилятора, который вы используете для компиляции кода C, и вы хотите использовать эту переменную в командной строке, то используйте "$CC", или только $CCесли значение переменной не содержит пробелов или символов подстановки оболочки.

$CC -o hello.elf hello.c

решение2

Эти два значения не эквивалентны. В строке, содержащей $(foo), $(foo)заменяется на вывод команды foo. Например:

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

В строке, содержащей $foo, $fooзаменяется на значение переменной с именем foo. Например:


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

решение3

В этом ответе не рассматривается синтаксис makefile.

"$(CC)"это вывод команды CC.

"$CC"— значение переменной CC.

Это должно прояснить разницу:

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

и

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

Связанный контент