GCC는 GNU 컴파일러 모음(GNU Compiler Collection)을 줄여서 부르는 명칭이다.
GNU 프로젝트는 여러 소프트웨어들이 자유롭게 돌아갈 수 있는 기반 생태계를 구축하기 위해 시작한 프로젝트다.
gcc는 GNU 프로젝트의 일환으로, 1987년 GNU 프로젝트의 컴파일러를 위해 리처드 스톨만이 작성, 개발하여 현재까지 널리 쓰이고 있는 컴파일러다. 원래는 C언어만을 지원했지만, 현재는 C++, Java, Fortran 등 여러 언어를 컴파일 할 수 있게 되었다. gcc는 1997년 개발 과정을 공개, 1999년 첫 버전이 나왔다.
컴파일러란, 어떤 언어의 코드를 다른 언어로 바꿔주는 과정을 말한다. 예를 들어 사람이 작성한 C언어를 컴퓨터가 이해할 수 있는 기계어로 바꿔주는 컴파일(Compile) 과정을 해주는 번역기이다.
gcc 컴파일러로 진행하는 컴파일 과정은 아래 그림과 같다.

- 전처리 -> 전처리기
- 컴파일 -> 컴파일러
- 어셈블 -> 어셈블러
- 링크 -> 링커
gcc hello.c 명령어를 입력하면 위 네 단계를 거쳐 실행 파일이 생성된다.
한 단계씩 코드와 함께 살펴보자.
1.
# 전처리 과정
gcc -E hello.c -o hello.i
전처리 과정을 거치면 소스 파일 hello.c 파일에서 확장 소스 파일인 hello.i 가 생성된다.
2.
# 컴파일 과정 [ .c -> (.i) -> .s ]
gcc -S hello.c
컴파일 과정을 거치면 hello.i 로부터 어셈블리어로 작성된 hello.s 파일이 생성된다.
3.
# 어셈블 과정 [ .c -> (.i) -> (.s) -> .o ]
gcc -c hello.c
어셈블리어 파일을 어셈블러가 읽어 기계어로 번역, hello.o 라는 오브젝트 파일로 변환한다. 이 파일은 컴퓨터가 읽을 수 있는 2진수 코드로 변환된 것이다.
4.
# 링크 단계 [ .o -> excutable(.exe) ]
gcc -o hello hello.c func.c # <- 외부 소스 파일
링크 단계에서는 작성한 프로그램이 사용하는 다른 프로그램이나 라이브러리를 링커가 연결한다. 그 결과로 생성된 파일이 실행 가능한 hello(.exe) 파일이다.
GCC 컴파일러의 여러 옵션
-o [파일명] [*.c] : 지정한 파일명으로 실행 파일을 저장한다.
ex) gcc -o result.out main.c
-E : 전처리 단계를 수행한 후, 컴파일 과정을 거치지 않는다.
실행 결과는 standard output에 출력된다. 파일 (*.i)을 저장하려면 -o 옵션과 함께 사용
-S : 컴파일 단계를 수행한 후, 어셈블 과정을 거치지 않는다.
실행 결과로 어셈블리어 .s 파일이 생성된다.
-c [파일명] [*.c] : 소스 코드를 컴파일 또는 어셈블하며, 링크를 하지 않는다.
파일명으로 오브젝트 파일을 생성한다
ex) gcc -c object main.c
-l [라이브러리] : 라이브러리 파일과 링크한다. 접미사나 확장자(.a/.o)가 없어도 링크함.
ex) gcc mytest.c -lcalc -o mytest
-D [지정할상수명]=[값] : 상수를 정의하기 위한 옵션.
ex) gcc -D SIZE=42 : SIZE라는 이름의 상수의 값을 42로 설정한다.
-I [디렉토리명] : 디렉토리명에서 헤더 파일을 검색한다.
-L [디렉토리명] : 디렉토리 내에서 라이브러리 파일을 찾는다.
주로 -o 옵션을 사용하게 될 것 같다.
아래는 -E, -S, -c를 실행한 결과를 캡쳐한 것이다.




화질이 너무 구리다;;
출처
[GCC] GCC 컴파일러 개념 정리
목차
80000coding.oopy.io
gcc 란?
gcc란 무엇일까 gcc란? GNU 컴파일러 모음(GNU Compiler Collection, 줄여서 GCC)는 GNU 프...
blog.naver.com
[Linux] 리눅스 gcc란? gcc로 C언어 컴파일하기
[Linux] 리눅스 gcc란? gcc로 C언어 컴파일하기
GCC란? GCC는 GNU 컴파일러 모음(GNU Compiler Collection)이다. GNU는 운영 체제의 하나이자 컴퓨터 소프트웨어의 모음집이다.(참고1) 현재 대부분 GNU와 LINUX를 결합하여 사용하기 때문에 이 조합을 짧게 "Li
code-lab1.tistory.com
'컴퓨터시스템' 카테고리의 다른 글
웹서버와 CGI와 WAS (+ MIME Type) (2) | 2024.02.22 |
---|---|
파일 디스크립터란? (File Descriptor) (0) | 2024.02.22 |
메모리 단편화와 메모리 할당 정책 (0) | 2024.02.07 |
C언어) 포인터와 주소 연산자 (0) | 2024.01.26 |
컴퓨터시스템 1주차 (0) | 2024.01.14 |