cc 명령어?

다수의 42 과제에서 C 소스 파일을 컴파일할 때 cc 명령어를 사용할 것을 요구합니다.

cc는 POSIX에서 정의한, C를 컴파일하는 명령어입니다.

cc 명령어에 대한 정보

cc 명령어에 대한 정보

우리가 자주 쓰는 C 컴파일러

대표적인 C 컴파일러로는 GCCClang이 있습니다.

윈도우는 MinGW와 마이크로소프트의 MSVC도 있지만, MinGWGCC로 보고, POSIX를 따르지 않는 마이크로소프트의 MSVC는 논외로 치겠습니다.

GCCClang을 모두 써 보셨다면, 둘의 사용법이 놀랍도록 비슷한 것을 알 수 있습니다.

Clang이 사실상의 표준처럼 쓰여서 GCC처럼 만들려고 했던 것도 있지만, 다른 이유도 있습니다.

필수로 반드시 사용하는 컴파일러 옵션

이런 필수 옵션들이 컴파일러마다 다르다면 컴파일러마다 사용법을 따로 익혀야 할 것입니다.

다행히도 그럴 필요가 없도록 이런 필수 옵션들을 POSIX에서 정의했습니다!

덕분에 어떤 플랫폼이라도 POSIX 환경이라면 실제로 어떤 컴파일러가 쓰일지 모르더라도 안심하고 cc 명령어를 사용해 컴파일할 수 있습니다.

실제로 cc는 어떤 컴파일러일까?

cc라는 컴파일러가 따로 있는 것은 아니고, 단지 규격일 뿐입니다.

보통 macOS에서는 Apple Clang으로, 리눅스에는 GCC를 설치했다면 GCC연결됩니다.

물론 POSIX 규격을 따르는 컴파일러이기만 하면 되기 때문에 둘 모두 아닐 수도 있긴 합니다.

cc 명령어 사용 시 알아두면 좋은 것

gccclang과 달리, cc 명령어는 어떤 컴파일러가 실행될지 알 수 없습니다.

알 수 있다면 명시적으로 그 컴파일러를 사용하는 것이 바람직합니다. (gccclang 등)

cc 명령어를 사용할 때는 POSIX에서 정의하지 않은 옵션은 사용하지 않는 것이 바람직합니다.

그런 옵션 중 자주 쓰는 것으로는 -Wall, -fsanitize=address, -g3 등이 있습니다.

대안

-Wall 등은 그 옵션을 지원하는 특정 컴파일러를 사용한다는 것을 명확히 하는 것이 좋습니다.

# POSIX cc에 정의된 옵션만 사용 (O)
cc -c main.c $(CFLAGS)

# POSIX cc에 정의되지 않은 옵션도 사용 (X)
cc -Wall -fsanitize=address -c main.c -o main.o $(CFLAGS)

# 해당 옵션을 지원하는 것이 명확한 컴파일러 지정 (O)
clang -Wall -fsanitize=address -c main.c -o main.o $(CFLAGS)

그래도... 과제가 요구한다면 어쩔 수 없겠죠...? 🥲

c89, c99 명령어

C 표준의 버전이 고정된 c89, c99 명령어도 POSIX에서 정의하고 있습니다.

cc 명령어보다는 c89c99 명령어를 쓰는 것이 더 바람직합니다.