C :: multiple definition 에러
카드 게임을 구현하는 코드를 짰는데, 컴파일해보니 이런 메시지가 나왔습니다.
0 errors, 0 warnings
아주 반가운 메시지죠.
하지만 실행이 되질 않더군요. 그래서 메시지를 자세히 보니
multiple definition of 'strSuit'
multiple definition of 'strFace'
라고 나와 있는 겁니다.
해석하면 strSuit, strFace 변수의 정의가 중복되었다는 건데, 어디서 중복되었는지를 찾질 못하고 이틀을 헤매었습니다. 원인도 모른 채 이렇게 수정해보고 저렇게 수정해보다가 static으로 정의하니 실행은 되더군요. 하지만 경고가 나오는 겁니다. 결국은 올바르게 해결한 게 아닌거죠.
일단, 저 두 문자열 배열을 static 변수로 정의한다는 것은 정적 메모리에 할당한다는 의미이고, 프로그램이 시작할 때부터 종료될 까지 메모리에 계속 존재할 거라는 거죠. 주석에 나와 있듯이 한 번만 쓰고 버릴 변수를 static으로 정의한다는 건 어불성설...
결국은 구글링을 해보았더니, 아주 간단한 이유 때문에 multiple definition 에러가 나왔던 것입니다.
먼저, 제가 작성한 프로그램의 대략적인 구조부터 알아야 합니다. 이 프로그램은 3개의 파일로 구성되어 있습니다.
- main.c
- card.c
- card.h
이렇게요.
main 소스파일은 프로그램의 전체적인 흐름이 함수 단위로 기술되어 있습니다. 그리고 card 소스파일은 main 에서 쓰이는 함수들을 정의하였습니다. 마지막 card 헤더파일은 참조할 라이브러리, 함수, struct, enum이 선언되어 있습니다. 그리고 결정적인 게 strSuit와 strFace가 정의되어 있습니다.
예, 문제는 헤더파일에 변수를 정의하였다는 거였습니다. 이 헤더파일을 참조하는 두 소스파일에서 각각 따로 변수를 생성하는데, 헤더파일에 이미 정의되어 있는 변수가 두 소스파일에서 중복되는 것이죠. 그러니 에러가 나올 수 밖에요. 가독성을 위한답시고 struct, enum과 같이 둔 게 화근이었습니다.
이로소 얻은 결론 하나,
"헤더파일에는 선언만 하자."
입니다.
그리고 struct와 enum이 에러를 일으키지 않는 다는 것은 정의가 아니라 선언의 개념이기 때문입니다.
"0x08 과거의 글모음 / 내 머리 속의 노트" 분류의 다른 글
| 블로그(텍스트큐브) 서버를 직접 만들어보기 - OS & Package 설치 | 2011/02/16 |
| C/Linux :: 리눅스에서 파일 덤프... dump.c | 2010/12/05 |
| C/Linux :: ls -l 을 수행하는 ll.c | 2010/10/30 |
| python :: Socket Communication with Thread | 2010/10/10 |
| 리눅스(우분투)에서 부경대학교 무선랜 접속하기 | 2010/07/19 |
