컴파일 흐름

컴파일/실행 과정

전처리, 컴파일, 링크, 실행을 나눠 보면 오류 메시지가 어느 단계에서 나온 것인지 빠르게 분리할 수 있다.

01

헤더 포함 확인

선언이 보이지 않는 오류는 전처리 또는 include 경로 문제일 가능성이 높다.

02

정의 연결

undefined reference는 선언은 봤지만 실제 함수나 전역 객체 정의를 못 찾았다는 뜻이다.

03

실행 환경 검토

파일 경로, 권한, 동적 라이브러리 위치는 컴파일 성공 뒤에 드러나는 문제다.

선언 오류
컴파일 단계 타입 이름이나 함수 선언을 찾지 못한다.
헤더와 namespace를 본다.
링크 오류
정의 누락 함수 본문, 라이브러리 연결, ODR 문제가 원인이다.
빌드 대상에 cpp가 포함됐는지 확인한다.
런타임 오류
실행 중 실패 입력 파일, 메모리 접근, 예외, 환경 변수에서 발생한다.
재현 입력을 고정한다.
ODR
하나의 정의 규칙 헤더에 비 inline 전역 정의를 두면 중복 정의가 생긴다.
선언과 정의를 구분한다.

단계 분리 · 헤더 · 라이브러리 점검

단계 분리 오류 메시지가 컴파일러, 링커, 실행 프로그램 중 어디에서 나온 것인지 구분하는가.
헤더 헤더에는 선언과 inline 가능한 정의만 두고 있는가.
라이브러리 외부 라이브러리를 사용할 때 include 경로와 link 경로를 모두 설정했는가.

오류 위치

// compile error: 이름과 타입을 못 찾음
// link error: 선언은 봤지만 본문을 못 찾음
// runtime error: 실행 중 입력, 수명, 환경이 깨짐