Krafton Jungle/2. Keywords

[WEEK05] GCC

munsik22 2025. 4. 10. 18:54

✅ GCC란 무엇인가?

GCC(GNU Compiler Collection)는 C, C++, Objective-C, Fortran, Ada, Go 등 여러 언어를 지원하는 범용 컴파일러이다. 그 중에서도 C 컴파일러로서의 역할이 가장 널리 알려져 있다.

  • 자유 소프트웨어 재단(GNU)에서 개발
  • 다양한 플랫폼에서 사용 가능
  • 많은 오픈소스 프로젝트에서 기본 컴파일러로 사용

💡 왜 Ubuntu에서 GCC를 사용하는가?

1. Ubuntu는 GCC와 찰떡궁합

Ubuntu를 포함한 대부분의 리눅스 배포판은 기본적으로 GCC와 함께 개발 환경이 구성되어 있다. 시스템 커널, 시스템 유틸리티 등 리눅스의 많은 핵심 요소들이 C로 작성되어 있으며, 이들 대부분이 GCC로 빌드된다.

2. 표준적이고 강력한 도구

GCC는 표준에 매우 충실하게 구현되어 있어서, ANSI C, ISO C 등 표준 C 문법을 정확하게 지원한다. 그 덕분에 학습용, 연구용, 상용 프로젝트 모두에서 안정적으로 사용할 수 있다.

3. 많은 도구 및 IDE와 호환

GCC는 Make, CMake, VS Code, gdb 디버거 등 다양한 개발 도구와 잘 통합되어 있다. 개발 환경 세팅 시 가장 무난하고 호환성 좋은 선택지이다.


🛠️ Ubuntu에서 GCC 사용법 정리

1. 설치 확인 및 설치

gcc --version

GCC가 없다면 다음 명령어로 설치:

sudo apt update
sudo apt install build-essential

2. 기본적인 컴파일

gcc hello.c -o hello

실행은 다음과 같이:

./hello

3. 컴파일 옵션 예시

gcc -Wall -g -O2 hello.c -o hello
  • -Wall: 모든 경고 메시지 출력
  • -g: 디버깅 정보 포함 (gdb 사용 가능)
  • -O2: 최적화 옵션 (속도 향상)

4. 여러 파일 컴파일

gcc main.c utils.c -o program

※ GCC 명령어 옵션 순서 – 어떻게 작동할까?

🔸 대부분의 경우, 순서가 크게 중요하지 않음

GCC는 내부적으로 옵션을 분류해서 처리하기 때문에 -g, -o, hello.c의 순서가 조금 바뀌어도 정상적으로 동작한다.

예를 들어:

gcc -g -o hello hello.c
gcc hello.c -o hello -g

둘 다 C 파일 hello.c를 디버깅 정보(-g) 포함해서 hello라는 실행 파일로 컴파일하라는 뜻이다.

🔸 하지만 링커 옵션이나 입력 파일의 위치가 중요할 때도 있음

특히 아래와 같은 상황에서는 순서가 결과에 영향을 줄 수 있다.

  • 링커 옵션 (-l, -L)
gcc main.c -lmylib

이때 -lmylib은 main.c에서 실제로 사용하는 함수가 있어야 링크가 성립된다. 그런데 다음처럼 순서를 바꾸면:

gcc -lmylib main.c

→ 컴파일 오류가 날 수 있다. 링커는 왼쪽부터 순서대로 필요한 라이브러리를 찾기 때문이다.

  • 다수의 소스 파일 컴파일 시 일반적으로는 문제가 없지만, 일부 상황에서는 순서에 따라 심볼을 찾는 위치가 바뀌어 에러가 발생할 수도 있다.

🧱 기본 옵션

옵션 설명
-o output 실행 파일 이름 지정 (a.out 대신 원하는 이름)
-c 컴파일만 하고 링킹은 하지 않음 (.o 오브젝트 파일 생성)
-Wall 모든 일반적인 경고 메시지 출력
-Wextra 추가적인 경고 메시지 출력
-g 디버깅 정보 포함 (gdb 사용 가능)

🚀 최적화 관련 옵션

옵션 설명
-O0 최적화 하지 않음 (디폴트, 디버깅에 좋음)
-O1 기본적인 최적화
-O2 더 많은 최적화 (가장 일반적으로 사용)
-O3 공격적인 최적화 (속도 위주, 코드 크기 증가 가능성 있음)
-Os 코드 크기 최소화에 집중
-Ofast -O3보다 더 과감한 최적화 + 표준 위반 가능

🧠 디버깅 / 경고 관련

옵션 설명
-Werror 경고를 오류로 처리해서 컴파일 실패시키기
-Wno-xxx 특정 경고 무시 (예: -Wno-unused-variable)
-pedantic 엄격하게 표준을 따르도록 함 (표준 위반 시 경고/오류)

🔗 링크 관련

옵션 설명
-l<library> 라이브러리 링크 (예: -lm은 libm.so, 수학 라이브러리)
-L<path> 라이브러리 검색 경로 지정
-static 정적 링크 (동적 라이브러리 대신 .a 사용)
-shared 공유 라이브러리 생성할 때 사용 (.so 파일 생성)

🏗️ 출력 제어

옵션 설명
-E 전처리만 수행 (출력은 표준 출력)
-S 어셈블리 코드까지 생성하고 종료 (.s 파일 생성)
-c 컴파일까지만 하고 링킹하지 않음 (.o 파일 생성)
-v 컴파일러 동작 과정을 상세하게 출력 (디버깅용)

📦 기타 유용한 옵션

옵션 설명
-std=c99 사용할 C 표준 버전 명시 (c89, c99, c11, gnu11, 등)
-I<dir> 헤더 파일 포함 경로 지정
-D<name> 매크로 정의 (-DDEBUG → 코드에서 #ifdef DEBUG)
-M 의존성 파일 생성 (Makefile에서 유용함)

'Krafton Jungle > 2. Keywords' 카테고리의 다른 글

[WEEK05] 동적 메모리 할당  (0) 2025.04.11
[WEEK05] 가상화  (0) 2025.04.10
[WEEK04] 포인터와 연결리스트  (0) 2025.04.07
[WEEK04] 그리디 알고리즘  (0) 2025.04.03
[WEEK04] 동적 프로그래밍 (DP)  (0) 2025.04.03