gcc (GNU Compiler Collection)

gcc란?

GNU Compiler Collection의 약자. 원래는 C 컴파일러로 시작했지만 지금은 C, C++, Go, Fortran 등 다양한 언어를 지원하는 컴파일러 모음이다.

  • 리눅스에서 사실상 표준 C 컴파일러
  • 오픈소스, 성능 좋음 → 시스템 프로그래밍·임베디드·OS 개발까지 두루 사용
  • Windows에서도 MinGW, WSL, MSYS2로 사용 가능

기본 사용법

gcc hello.c -o hello   # 컴파일
./hello                # 실행

컴파일 4단계

gcc hello.c -o hello 한 줄이 내부적으로 거치는 단계:

단계명령입력 → 출력하는 일
전처리 (Preprocessing)gcc -E hello.c -o hello.i.c.i#include, #define 등 처리
컴파일 (Compilation)gcc -S hello.i -o hello.s.i.sC 코드 → 어셈블리어
어셈블 (Assembly)gcc -c hello.s -o hello.o.s.o어셈블리어 → 기계어 (객체 파일)
링크 (Linking)gcc hello.o -o hello.o → 실행파일라이브러리 연결, 실행파일 생성

단계별로 멈추고 싶을 때만 위 옵션을 쓴다. 보통은 gcc hello.c -o hello 한 줄로 끝.

시각적 자료

시각적자료


자주 쓰는 옵션

옵션설명
-o <file>출력 파일 이름 지정
-Wall모든 경고 출력
-g디버깅 정보 포함 (gdb 사용 시 필수)
-O0 / -O1 / -O2 / -O3최적화 수준 (숫자 높을수록 강함)
-std=c99, -std=c11C 표준 지정
-c링크 없이 .o까지만 생성
-I<dir>헤더 파일 디렉토리 추가
-L<dir>라이브러리 디렉토리 추가
-l<lib>라이브러리 링크 (예: -lm = 수학 라이브러리)
gcc -g hello.c -o hello          # 디버깅용
gcc -O2 hello.c -o hello         # 최적화
gcc main.c utils.c -o myprogram  # 여러 파일 한 번에

객체 파일 분리 빌드

gcc -c main.c -o main.o
gcc -c utils.c -o utils.o
gcc main.o utils.o -o myprogram   # 링크 (함수 참조 이 단계에서 해결)

utils.c만 수정했다면 main.o는 재사용하고 수정된 것만 다시 컴파일:

gcc -c utils.c -o utils.o
gcc main.o utils.o -o myprogram

관련 도구

도구설명
make컴파일 자동화 (Makefile 사용)
gdbGNU 디버거 — 한 줄씩 실행, 변수 추적
valgrind메모리 누수 검사
objdump, nm, readelf바이너리 분석

Makefile 기초

make 명령 하나로 빌드를 자동화하는 설정 파일.

myproject/
├── main.c
├── utils.c
├── utils.h
└── Makefile
CC = gcc
CFLAGS = -Wall -g

all: main

main: main.o utils.o
	$(CC) $(CFLAGS) -o main main.o utils.o

main.o: main.c utils.h
	$(CC) $(CFLAGS) -c main.c

utils.o: utils.c utils.h
	$(CC) $(CFLAGS) -c utils.c

clean:
	rm -f *.o main
make        # 빌드
make clean  # 중간 파일 삭제
gdb ./main  # 디버깅 (-g 옵션 필요)

Makefile 명령 앞 들여쓰기는 탭(tab) 이어야 한다. 스페이스 쓰면 에러남.


Docker에서 C 컴파일하기

기본 예제

FROM gcc:latest
WORKDIR /usr/src/app
COPY . .
RUN gcc -o hello hello.c
CMD ["./hello"]
docker build -t my-c-program .
docker run --rm my-c-program

Makefile 사용 예제

my-c-project/
├── main.c
├── utils.c
├── utils.h
├── Makefile
└── Dockerfile
FROM gcc:latest
WORKDIR /app
COPY . .
RUN make
CMD ["./app"]
docker build -t my-make-c-app .
docker run --rm my-make-c-app

Dockerfile 팁

용도예시
디버깅용 빌드RUN gcc -g -o hello hello.c
최적화 빌드RUN gcc -O2 -o hello hello.c
빌드 캐시 활용COPYRUN gcc 순서 지키기
외부 라이브러리RUN apt-get install -y lib... 추가

© 2022 JeongHwan Yun.