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