C 빌드는 컴파일과 링크가 분리되므로, 선언 오류와 정의 오류가 다른 단계에서 드러납니다.
- 컴파일은 됐는데 링크에서 터지는 이유를 다시 보고 싶다
undefined reference와multiple definition을 어떻게 나눠 보나 헷갈린다- 헤더/소스 파일 분리와 실제 빌드 명령이 어떻게 이어지는지 정리하고 싶다
숏컷 코드
bash
cc -Wall -Wextra -c main.c
cc -Wall -Wextra -c math_utils.c
cc main.o math_utils.o -o app기본 흐름
컴파일은 각 .c 파일을 개별 오브젝트로 만드는 단계이고, 링크는 그 오브젝트 파일들을 묶어 최종 실행 파일을 만드는 단계입니다.
c
/* math_utils.h */
double distance(double a, double b);c
/* math_utils.c */
double distance(double a, double b) {
return a - b;
}컴파일 단계에서는 선언만 맞아도 넘어갈 수 있지만, 링크 단계에서는 실제 정의가 필요합니다.
대표 오류
undefined reference는 선언은 봤지만 실제 정의를 최종 링크에서 못 찾은 경우입니다.
.o파일을 링크에 안 넣음- 라이브러리 옵션 누락
- 함수 이름이나 시그니처 불일치
multiple definition은 같은 심볼 정의가 둘 이상 있는 경우입니다.
- 헤더에 전역 변수 정의를 넣음
- 헤더에 일반 함수 본문을 넣음
체크포인트
- 컴파일 오류인지 링크 오류인지 먼저 구분합니다.
- 선언은 헤더, 정의는
.c에 둡니다. undefined reference는 정의를 못 찾은 경우입니다.multiple definition은 같은 심볼 정의가 여러 곳에 있는 경우입니다.- 헤더에 전역 변수 정의나 일반 함수 본문을 넣으면 링크 단계에서 크게 터지기 쉽습니다.
주의할 점
함수나 전역 변수를 헤더에 "정의"해 두면 컴파일은 지나가도 링크에서 크게 터집니다. C 빌드 문제는 종종 코드 문법보다 파일 배치와 심볼 소유권 문제라는 점을 먼저 의심하는 편이 좋습니다.
참고 링크
1 sources