$(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

나는 일반적으로 C 컴파일러의 이름을 보유하는 $(CC)변수의 확장 역할을 하는 Makefile을 본 적이 있다고 가정합니다 . Makefile의 변수 확장 CC구문 $(...)은 다중 문자 이름을 가진 변수가 확장될 때마다 사용됩니다. 그렇지 않으면 리터럴이 뒤에 오는 $CC변수 값으로 확장됩니다 ( 사실 Makefile에서 와 동일합니다 ).CC$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 ...

관련 정보