✅ 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 |