본문 바로가기

공부

[KOSTA 수업정리] GCC Compiler

gcc 란? 

원래는 GNU C Compiler를 의미했지만 1999년부터 GNU Compiler Collection을 의미한다고 합니다. 

 

gcc가 실행시키는 프로그램

- 전처리기 : cpp

- 컴파일러 : cc1

- 어셈블러 : as

- 링커 : ld 

 

단계별 처리 방법

 

다들 아시겠지만 컴퓨터는 사람이 작성한 C / Python 등의 고급 언어의 문장을 알아들을 수 없고, 오직 01의 이진수 형태의 바이너리 형태만 알아들을 수 있습니다. 따라서 컴파일이라는 사람의 언어를 컴퓨터의 언어로 바꾸는 과정이 필요합니다!

 

1) 전처리 단계 : preprocessing 과정으로써 소스 파일(file.c)에 gcc를 동작시키면 가장 먼저 전처리기인 cpp가 동작한다. cpp는 소스 파일의 #include와 #define과 같은 #으로 시작되는 전처리기 부분을 처리 한다. 즉, 필요한 헤더 파일을 삽입하고 실행 문장의 매크로를 상수로 변환한다. 소스 파일이 전처리기를 거치면 file.i라는 이름의 파일이 생성된다. 하지만 이는 디스크에 저장되지는 않는다.

 

2) 컴파일 단계 : 컴파일러가 전처리된(file.i)ㄹ로부터 어셈블리어로 된 파일(file.s)을 생성한다. file.s또한 마찬가지로 디스크에 저장되지는 않는다.  

 

3) 어셈블 단계 : 어셈블리어로 된 파일(file.s)을 기계가 직접 이해할 수 있는 기계어로 된 오브젝트 파일(file.o)로 변환합니다. 

 

4) 링크 단계 : 목적 파일로 불리는 오브젝트 파일은 printf, scanf와 같은 라이브러리 함수에 해당하는 코드가 없기 때문에 실행이 불가능합니다. 또한, 소스 코드들이 하나의 파일에 모아져있는 경우는 거의 없고 따로따로 파일이 구성되어 있는 경우가 대부분입니다. 따라서 흩어져 있는 파일들을 모으는 과정이 필요한데 이것이 링크 단계입니다. 라이브러리 함수와 obj 파일을 연결해서 실행 가능한 파일(exe)로 만들어야 비로소 빌드가 완료되는 셈입니다. 컴파일 할 때는 각 단계별로 옵션을 사용해서 얼마나 진행되어 있는지 그 상황을 볼 수 있다고 합니다. 

 

 

확장자 종류 처리방법

.c C 소스 파일 gcc로 전처리, 컴파일, 어셈블, 링크
.C, .CC, cpp, hpp C++ 소스 파일 g++로 전처리, 컴파일, 어셈블, 링크
.i 전처리된 C 파일 gcc로 컴파일, 어셈블, 링크
.ii 전처리된 C++ 파일 g++로 컴파일, 어셈블, 링크
.s 어셈블리어로 된 파일 어셈블, 링크
.S 어셈블리어로 된 파일 전처리, 어셈블, 링크
.o 오브젝트 파일 링크
.a, .so 컴파일된 라이브러리 파일 링크

 

 

gcc 실행 방법

 

gcc를 이용해 컴파일 하는 방법은 

gcc 소스파일_이름 

위와 같이 입력하면 됩니다. 일반적으로 gcc를 이용해 컴파일에 성공하면 a.out이라는 실행 가능한 파일이 생성됩니다. 해당 파일이 들어있는 디렉토리에 간 뒤 ./a.out 명령어를 이용하면 실행이 됩니다.

참고로 저는 gcc 컴파일러를 사용할 때 gcc file.c -o main 이런식으로 컴파일을 해줍니다.  

 

backjoon이라는 디렉토리에서 gcc 컴파일러 이용해서 실행한 모습입니다.

주의할 점은 해당 디렉토리에 들어가서 ./ 현재 경로를 의미하는 ./을 붙여줘야 한다는 것입니다. 

 

 

 

이와 같이 저는 백준 문제 풀 때도 wsl에 들어가서 gcc 컴파일러를 이용해서 푸는 편입니다.

 

 

 

이외에도 gcc 옵션 등(ex : o옵션 etc...) 여러 가지 옵션들이 있지만 여기서 마치도록 하겠습니다. 컴파일 전과정에 대해서 자세하게 게 기술해놓은 책 중에서 전문가를 위한 C 책이있습니다. 강사님께서 추천해주셨는데 1000페이지 정도로 내용이 방대하기는 하지만 C를 좀 더 알고 싶은 분들에게 강력 추천드립니다.

 

 

+) C언어는 gcc 컴파일러 C++은 g++ 컴파일러를 이용하는데 gcc를 g++로만 바꿔주면 됩니다

+) gcc 소스파일1 소스파일2 -o main 이런식으로 써주면 분리 컴파일을 할 수 있는데 이제 소스파일이 많아지면 소스파일의 이름을 일일히 입력할 수 없기 때문에 빌드 자동화 도구인 CMake 등을 이용하게 됩니다.

 

 

***개인적으로 공부한 것을 메모한 것입니다. 틀린 부분이 있을 수 있습니다***