컴파일이란?
인간이 이해할 수 있는 언어로 작성된 C프로그램을
컴퓨터가 이해할 수 있는 기계어 파일로 변환하는 과정이다.
컴파일 과정은 총 4단계로 이루어져 있다.
1. 전처리 (Preprocessing)
: 소스코드에서 #으로 시작하는 전처리 지시문을 처리하는 단계이다.
- 헤더파일 내용 삽입 (#include)
- 매크로 치환 (#define)
- 조건부 컴파일 처리(#ifdef, #ifndef 등)
2. 컴파일러 (Compilation)
: 전처리 결과를 어셈블리 코드로 변환하는 단계이다.
어셈블리어 : 기계어와 일대일 대응이 되는 컴퓨터 프로그래밍의 저급 언어이다.

어셈블리어 코드 화면
출처 : https://ko.wikipedia.org/wiki/%EC%96%B4%EC%85%88%EB%B8%94%EB%A6%AC%EC%96%B4
3. 어셈블 (Assembly)
: 어셈블리 코드를 기계어로 바꾸는 단계이다.
- 이때 생기는 파일이 .o 또는 .obj 파일이다.

출처 : https://ko.wikipedia.org/wiki/%EA%B8%B0%EA%B3%84%EC%96%B4
4. 링킹 (Linking)
: 여러 오브젝트 파일과 라이브러리들을 하나의 실행 파일로 묶는 단계
- 이때 메모리 주소를 결정한다.
- 외부 참조 해결(extern 변수나 함수들)
결과적으로 다음과 같은 파일이 생성된다.
- 유닉스/리눅스 : a.out 또는 실행파일
- 윈도우 : .exe 파일
그럼 빌드란 무엇인가?
: 빌드는 위에 작성한 전 과정이다.
즉, 소스코드(.c)를 실행파일(.exe, a.out 등)으로 바꾸는 전체 흐름이다.
왜 비주얼스튜디오에서 컴파일이랑 빌드를 따로 제공하는거죠??
: 효율적인 개발 흐름을 지원하기 위해서입니다.
visual Studio에서의 "컴파일" VS "빌드"
컴파일
- .c -> .obj (오브젝트 파일 생성)
- 소스파일을 개별적으로 기계여로 변환
빌드
- 모든 .obj를 링킹해 실행파일 생성
- 전체 프로젝트를 빌드
[소스코드]
↓
[Compile] ⇒ [오브젝트 파일 (.obj)]
↓
[Link] ⇒ [실행 파일 (.exe)]
컴파일과 빌드를 분리함으로써 얻는 점
- 수정된 파일만 빠르게 테스트 가능
- 여러 개의 .c 파일이 있고, 하나의 파일만 고치면 된다.
- 전체를 빌드할 필요 없이 그 파일만 컴파일 하면 된다. => 시간절약
- 에러 디버깅과 컴파일 단계 문제를 분리해서 볼 수 있다.
- 컴파일 단계에서 생기는 문법 오류, 타입 오류 등은 컴파일만 해도 확인 가능
- 링킹 에러 (unresolved external symbol)는 컴파일은 되지만 빌드시 발생함
결론 : 시간 절약을 위해!
빌드 시간이 오래 걸리는 대규모 프로젝트에서 불필요한 재빌드를 줄일 수 있다!