yocto poky 환경을 사용하려고 합니다. 나는 다음을 수행했습니다.
#source environment-setup-cortexa9hf-neon-poky-linux-gnueabi
이제 다음을 사용하여 프로그램을 컴파일하려고 하면:
#$(CC) hello.c -o hello.elf
$(CC)
정의되지 않았기 때문에 오류가 발생합니다.
하지만 이렇게 하면 $CC
효과가 있습니다. $(CC) 와 $CC
? 의 근본적인 차이점이 무엇인지 혼란스럽습니다 .
답변1
일반적으로 C 컴파일러의 이름을 보유하는 $(CC)
변수의 확장 역할을 하는 Makefiles에서 이를 본 적이 있다고 가정합니다 . 다중 문자 이름을 가진 변수가 확장될 때마다 Makefile의 변수 확장 구문이 사용됩니다. 그렇지 않으면 리터럴이 뒤따르는 변수 값으로 확장됩니다(실제로 Makefile에서와 동일).CC
$(...)
$CC
C
C
$CC
$(C)C
그러나 쉘에서는 구문이 다르기 때문에 $(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 ...