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

관련 정보