gcc (GNU Compiler Collection)
in Blog / Tech Stack on 운영체제, C 언어
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 → .s | C 코드 → 어셈블리어 |
| 어셈블 (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=c11 | C 표준 지정 |
-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 사용) |
gdb | GNU 디버거 — 한 줄씩 실행, 변수 추적 |
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 |
| 빌드 캐시 활용 | COPY → RUN gcc 순서 지키기 |
| 외부 라이브러리 | RUN apt-get install -y lib... 추가 |