C, C++, Objective-C, Fortran, Ada 등을 포함한 다양한 프로그래밍 언어를 위한 무료 오픈 소스 컴파일러다.
Linux 및 Unix 커뮤니티에서 널리 사용되며 Windows와 같은 다른 운영 체제에서도 사용할 수 있다.
높은 수준의 최적화와 x86, ARM 및 PowerPC를 포함한 광범위한 플랫폼 및 아키텍처를 지원한다.
다양한 디버깅 및 프로파일링 도구를 지원하므로 코드의 버그를 쉽게 식별하고 수정할 수 있다.
소스 코드가 실행 파일이 되는 과정
GCC 컴파일러가 소스 코드를 실행 파일로 만들기까지 4가지 단계를 거친다.
[ *.c -> (*.i) -> (*.s) -> (*.o) -> excutable ]
전처리 단계
컴파일 단계
어셈블 단계
링크 단계
gcc hello.c 명령어를 입력하면 네 가지 단계를 거쳐서 실행 파일이 생성되지만, 각 단계의 파일들은 임시 파일로 생성되었다가 사라진다.
1. 전처리 단계
전처리기가 소스 파일 내의 전처리기 지시자를 처리한다.
전처리기 지시자란?
# 으로 시작하고 세미콜론 없이 개행문자로 종료되는 라인을 의미한다.
#include : 지정된 특정 파일의 내용을 해당 지시자가 있는 위치에 삽입.
#define : 매크로 함수 및 상수 정의에 사용한다. 코드 내의 해당 상수를 프로그래머가 정의한 문자열로 대체한다.
전처리 단계를 거치면 소스 파일 hello.c 에서 확장 소스 파일인 hello.i 가 생성된다.
전처리 과정 수동 실행 방법 :
gcc -E main.c -o main.i
2. 컴파일 단계
전처리된 파일인 hello.i 로부터 어셈블리어로 된 파일인 hello.s 파일을 생성한다.
gcc -S main.c
3. 어셈블 단계
어셈블리어 파일 hello.s 를 기계어로 된 오브젝트 파일 hello.o 파일로 변환한다. 즉, 컴퓨터가 읽을 수 있는 0과 1로 이루어진 2진수 코드로 변환하는 것이다.
gcc -c main.c
4. 링크 단계
링크 단계는 작성한 프로그램이 사용하는 다른 프로그램이나 라이브러리를 가져와서 연결하는 과정이다. 그 결과로 실행 가능한 파일을 생성한다. (hello.o → hello)
gcc -o main main.c func.c
아래 옵션은 위에서 사용한 옵션들이다.
-o [파일명] [*.c] : 지정한 파일명으로 실행 파일을 저장한다.
ex) gcc -o result.out main.c
-E : 전처리 단계를 수행한 후, 컴파일 과정을 거치지 않는다.
실행 결과는 standard output에 출력된다.
-S : 컴파일 단계를 수행한 후, 어셈블 과정을 거치지 않는다.
실행 결과로 어셈블리어로 변환된 *.s 파일이 생성된다.
-c [파일명] [*.c] : 소스 코드를 컴파일 또는 어셈블하며, 링크를 하지 않는다.
파일명으로 오브젝트 파일을 생성한다.
ex) gcc -c ft_isalnum.c
-I [디렉토리명] : 디렉토리명에서 헤더 파일을 검색한다.
-l [라이브러리] : 라이브러리 파일과 링크한다. 접미사나 확장자(.a/.o)가 없어도 링크한다.
ex) 라이브러리 파일이 libmath.a 일때 다음과 같이 작성
gcc myfile.c -lmath -o myfile
-L [디렉토리명] : 디렉토리 내에서 라이브러리 파일을 찾는다.
-D [매크로상수명]=[값] : 매크로 상수를 정의하기 위한 옵션이다.
ex) gcc -D BUFFER_SIZE=42 : BUFFER_SIZE 라는 매크로 상수의 값을 42로 설정한다.