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이 에러를 일으키지 않는 다는 것은 정의가 아니라 선언의 개념이기 때문입니다.

Similar Posts

  • 7-Zip으로 포터블 파이어폭스 플러그인 설치하기

    포터블 불여우는 Data\Plugins 에 몇몇 필수 플러그인을 설치해야 사용하는 데 불편이 없습니다. 어떤 플러그인을 설치해야 하냐면, Flash Player, Windows media player, ShockWave Player 플러그인입니다. 오늘은 이 플러그인들을 7-Zip을 이용하여 설치하는 방법을 소개하겠습니다. 필요한 것 필요한 것은 당연히 포터블 불여우가 있어야 하겠구요. 그리고 위에 링크 걸어놓은 플러그인 설치 파일들입니다. 마지막으로 7-Zip이 있으면 됩니다. 7-Zip은 다들 아시다시피…

  • GTK+ :: C언어의 간편한 GUI 툴킷

    누군가가 그러더군요. 언어는 단지 도구일 뿐이고, 필요에 의해 쓰일 뿐이다. 저 말처럼 C언어를 익히니까 GUI 툴킷도 배우고 싶어졌습니다. 그래서 시작한 게 GTK+입니다. GTK+는 C언어를 기반으로 하는 GUI 툴킷입니다. 알아보니까 많이 쓰인다는 QT는 C++를 배워야 한다고 해서요. 배우다 보니까 여러 가지로 신기합니다. 그리고 재미있구요. 위 그림같은 창 하나 달랑 띄우는데도 코드가 여러 줄입니다. 그래도 이 정도면…

  • imagEmail, 간략한 기획

    비주얼 베이직으로 만들었던 hisAlpha Image를 C 언어를 이용하여 리눅스용으로 다시 만들려고 합니다.  리눅스용이라고는 하나, 윈도우나 OS X용으로도 쉽게 포팅될 듯합니다. hiaAlpha Image는 일종의 프로토타입인 것이죠. 사실, 강분도 님의 권유가 아니었으면 그냥 묻혔을겁니다. ㅋ 아래는 간략한 기획입니다. 기능 이메일 주소를 이미지로 만듬. 15종의 메일서버 지원. 개발환경 환경: 리눅스 (Ubuntu 8.10, i386) 언어 및 툴킷 : C,…

  • C :: [열혈강의 C 프로그래밍] p.115 char_add.c

    tothefelix 님의 블로그에서 아래의 코드를 가져왔습니다. 언뜻 보면 정상적인 코드인 것 같으나, 유심히 보면 자료형이 잘못된 것을 알 수 있습니다. 1바이트의 char 형 변수에 4바이트의 int 형 값을 넣는 오류입니다. 명백히 코드 상의 오류지요. 정말 열혈강의에 저런 코드가 예문으로 나와 있다면 무척 실망입니다. 역시 국내 C 레퍼런스로는 김상형 님의 “혼자 연구하는 C/C++“가 최고의 레퍼런스가 아닌가…

  • imagEmail, GUI 구현

    GTK+와 Glade 3로 구현한 GUI입니다. 이제 여기에 C 코드로 알고리즘만 얹어 놓으면 됩니다. windowMain windowMain은 이름 그대로 메인 화면입니다. 오른쪽의 드롭다운 버튼으로 이메일의 서버종류를 선택할 수 있습니다. 우측 상단의 x 버튼으로 프로그램을 종료합니다. dialogSave dialogSave는 파일을 저장할 때 나오는 대화상자입니다. 아직 100% 구현되지 않았는데, 다 구현되면 “저장”, “취소” 버튼 위에 이메일 이미지가 어떻게 나오는지 보여줄…

0 Comments

  1. 개발환경 버전이 바뀌었는데 오류가 계속떠서..ㅠㅠ 고생하던 중
    덕분에 해결했습니다. 팁 공유 감사합니다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다