Я пытаюсь использовать среду 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 ...