본문 바로가기
CS

리눅스에서 C++ 프로그래밍을 위한 gcc, g++ 의 개념과 활용

by Warehaus 2024. 2. 18.

 

 

리눅스에서 C++ 코드를 작성하고 이를 바이너리로 만들기 위해서는 gcc 또는 g++ 이 필요하다. 
오늘은 이 도구들의 개념에 대해 알아보고, 어떻게 사용하는지 알아보고자 한다.

 

전공자라면 학교에서 자연스럽게 접할 수 있는 부분이지만, 요즘같이 여러 분야에서 프로그래밍을 접하는 환경에서는 다소 생소할 수 있는 개념이라고 생각해서 포스팅을 쓰게 되었다.

 

반응형

 

gcc

 

개념 : GNU OS의 컴파일러를 시작으로 시작 된 GNU Compiler Collection
지원 언어 : C, C++, Objective-C, Fortran, Ada, Go, D

 

gcc는 컴파일러이다.

 

리처드 스톨먼에 의해 만들어 진 자유소프트웨어 재단에서 발현된 GNU 프로젝트의 일환으로 정말 널리 사용되는 컴파일러이다.  리눅스 환경에서 C로 작성 된 프로그램을 작성해 본 개발자라면 피해가기 어려운 소프트웨어이다.

 

코드파일을 생성하여 코드를 작성하고 gcc 를 통해 빌드를 수행하며, 빌드 시  linking, 최적화 수준 등의 옵션을 통해 원하는 빌드를 구성할 수 있다.

 

간단한 예시코드를 작성해보고 gcc가 어떻게 동작하는지 알아보자.

 

 

우선 아래와 같이 c++ 코드를 작성하였다.

 

 

 

gcc 를 이용해 빌드를 해보면 아래와 같은 출력이 확인된다.

 

$ gcc test.cc
/usr/bin/ld: /tmp/ccTxKCKW.o: in function `main':
test.cc:(.text+0x12): undefined reference to `std::cout'
/usr/bin/ld: test.cc:(.text+0x17): undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)'
/usr/bin/ld: test.cc:(.text+0x21): undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::endl<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&)'
/usr/bin/ld: test.cc:(.text+0x2c): undefined reference to `std::ostream::operator<<(std::ostream& (*)(std::ostream&))'
/usr/bin/ld: /tmp/ccTxKCKW.o: in function `__static_initialization_and_destruction_0(int, int)':
test.cc:(.text+0x60): undefined reference to `std::ios_base::Init::Init()'
/usr/bin/ld: test.cc:(.text+0x75): undefined reference to `std::ios_base::Init::~Init()'
collect2: error: ld returned 1 exit status

 

 

gcc 가 C++를 지원한다고 하는데 안되는건가?

 

아니다.

 

아래와 같이 옵션을 주변 .cc 파일을 빌드할 수 있다.

 

$ gcc test.cc -lstdc++

 

빌드가 완료되면 a.out 실행파일이 생성되어 코드의 결과를 확인 가능하다.

 

warehouse@warehouse-VirtualBox:~/Desktop$ gcc test.cc -lstdc++
warehouse@warehouse-VirtualBox:~/Desktop$ ls
a.out  test.cc
warehouse@warehouse-VirtualBox:~/Desktop$ ./a.out 
Hello world!

 

 

그런데 -lstdc++ 이 무슨 의미일까?

 

stdc++ 를 gcc 옵션 -l 로 링킹하는 옵션을 의미한다.

 

 

GNU c++ library 관련한 자세한 정보는 아래를 참고하자.

https://gcc.gnu.org/onlinedocs/libstdc++/

 

The GNU C++ Library

Short Contents Copyright (C) 2008-2024 FSF Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Inva

gcc.gnu.org

 

 

gcc 관련하여 더 궁금한 상세내용이 있다면 아래 gcc 링크를 참고하면 도움이 될 것이다.

https://gcc.gnu.org/

 

GCC, the GNU Compiler Collection - GNU Project

GCC, the GNU Compiler Collection The GNU Compiler Collection includes front ends for C, C++, Objective-C, Fortran, Ada, Go, and D, as well as libraries for these languages (libstdc++,...). GCC was originally written as the compiler for the GNU operating sy

gcc.gnu.org

 


 

g++

 

개념: GNU Compiler Collection(GCC)의 일부로 제공되는 C++ 언어 컴파일러. GCC는 여러 언어를 지원하는 컴파일러 컬렉션으로, C, C++, Fortran, Ada, Objective-C 등 다양한 언어를 지원한다.

 

g++ 의 사용은 gcc와 크게 다르지않다.  컴파일러 이름만 봐서는 C++만 빌드가 가능할 것 처럼 보이나 C언어 코드도 빌드가 가능하다.

 

사용방법은 아래 예시를 참고하자. 위에서 작성 한 gcc 와 동일한 코드를 사용하였다.

 

warehouse@warehouse-VirtualBox:~/Desktop$ ls
test.cc
warehouse@warehouse-VirtualBox:~/Desktop$ g++ test.cc
warehouse@warehouse-VirtualBox:~/Desktop$ ls
a.out  test.cc
warehouse@warehouse-VirtualBox:~/Desktop$ ./a.out 
Hello world!

 

gcc와 다르게 별도의 옵션을 주지 않아도 .cc 파일 (C++코드) 빌드가 가능한 것을 볼 수 있다.

왜 이런 차이가 발생하는 것일까?

 

반응형

gcc 와 g++ 의 차이

 

gcc와 g++ 모두 GNU Compiler Collection에 속하며, 무료 소프트웨어임에는 차이가 없다. 

두 컴파일러 모두 빌드하는 파일 타입에 따른 backend 사용을 하기 때문에 기본적인 동작은 유사하나 위의 예시에서 보았듯이 약간의 차이가 있다.

 

우선 명백한 차이라고 말하기는 어렵지만, 기본적으로 gcc는 C언어 코드를 컴파일하는데 사용, g++은 C++ 언어를 컴파일 하는데 사용한다. g++ 은  gcc 에 일부 옵션을 추가한 것과 동일하게 동작하는데  'gcc -xc++ -lstdc++ -shared-libgcc' 명령에 상응하는 동작을 보이며, 이는 '-v' 옵션을 통해 확인할 수 있다.  (-xc++, -lstdc++, -shared-libgcc 는 gcc의 옵션이다.)

 

그리고 g++은 gcc와는 다르게 linker option '-lm' 을 기본적으로 설정하며, 이는 math.h 의 구현부인 libm 을 링크하기 위함이다.

 

위에서 설명하였듯이 g++을 통해 코드를 빌드 하더라도 gcc 에 옵션을 추가하여 사용하는 격이기 때문에 GNU 컴파일러의 본질은 gcc라고 보아도 무방할 것이다.

 

 

참고 : https://stackoverflow.com/questions/172587/what-is-the-difference-between-g-and-gcc