리눅스 환경에서 개발을 하다 보면 gcc와 g++ 컴파일러를 상황에 따라 번갈아 사용하게 됩니다. 두 컴파일러는 이름이 비슷해 같은 도구처럼 느껴지지만, 실제로는 몇 가지 중요한 차이점이 있습니다. 이번 글에서는 gcc와 g++의 차이를 자세히 살펴보겠습니다.
GCC와 G++란?
gcc는 GNU 프로젝트에서 제공하는 C 컴파일러이고, g++는 GNU C++ 컴파일러입니다. 참고로 초기의 GCC는 'GNU C Compiler'를 의미했지만, 현재는 다양한 언어를 지원하는 'GNU Compiler Collection'이라는 이름으로 불립니다.
gcc와 g++의 주요 차이점
- 파일 처리 방식: gcc는 *.c 파일은 C 코드로, *.cpp 파일은 C++ 코드로 각각 구분하여 컴파일합니다.
- g++의 동작: g++ 역시 *.c와 *.cpp 파일을 모두 컴파일할 수 있지만, 확장자와 관계없이 모두 C++ 파일로 취급합니다.
- 라이브러리 링크: g++로 오브젝트 파일을 링크하면 표준 C++ 라이브러리가 자동으로 포함됩니다. 반면 gcc는 이 작업을 수행하지 않기 때문에, C++ 프로그램을 gcc로 링크하려면 -lstdc++ 옵션을 직접 지정해야 합니다.
- 사전 정의 매크로: gcc가 C 파일을 컴파일할 때 사용되는 사전 정의(predefined) 매크로의 수는 상대적으로 적습니다.
- C++ 컴파일 시 매크로: gcc가 C++ 파일을 컴파일할 때는 더 많은 사전 정의 매크로가 사용되며, g++ 역시 마찬가지로 많은 매크로가 정의된 상태로 컴파일됩니다.
C++ 파일에 추가로 정의되는 매크로
C++ 파일을 컴파일할 때 추가로 정의되는 대표적인 매크로는 다음과 같습니다.
#define __GXX_WEAK__ 1
#define __cplusplus 1
#define __DEPRECATED 1
#define __GNUG__ 4
#define __EXCEPTIONS 1
#define __private_extern__ extern
이 중 __cplusplus 매크로는 현재 컴파일되는 코드가 C++인지 판별하는 데 널리 활용됩니다. 조건부 컴파일(#ifdef)과 함께 사용하면 C와 C++ 양쪽에서 호환되는 헤더 파일을 작성할 때 매우 유용합니다.
정리
결론적으로 gcc와 g++의 핵심 차이는 소스 파일 해석 방식과 표준 C++ 라이브러리 자동 링크 여부입니다. 순수 C 프로젝트라면 gcc를, C++ 프로젝트라면 g++를 사용하는 것이 일반적이며, 예기치 않은 링크 오류를 피할 수 있는 안전한 선택입니다.