2021. 5. 29. 17:18ㆍ프로그래밍/C
개발을 하다보면 정말 무궁무진한 오류와 만나게되는 것 같습니다.
아직 학부생 입장으로서 다 만나본 것은 아니지만 어느정도 에러처리가 가능하게 되었다고 생각했습니다.
그렇게 믿고 있었는데,,, 링크오류를 만났습니다. 디버깅이 안돼서 고전하다가 구글링도 많이 해보았습니다.
각설하고, 오류 해결법을 알려드리겠습니다.
"여러 곳에 include되는 헤더파일에 있는 전역변수를 삭제한다."
저의 경우, 팀프로젝트를 하는 과정에서 다중소스코드 프로그램을 설계할 때 만났습니다.
easyStrings라는 포인터 배열이 있었는데, 그걸 3개의 c파일에서 사용해야 됐었습니다.
그래서 이전 코드 작성자분께서 헤더파일에 전역변수로 선언을 해놓으셨습니다.
문제의 원인은 다음 두 가지 때문입니다.
1. 헤더파일을 include하는 것은 단순히 코드에 헤더파일 내부 텍스트를 붙여넣기 한 것에 지나지 않습니다.
2. 초기화 값이 같은 전역 변수는 중복선언될 수 없습니다.
1로 인해 서로다른 두 .c파일에서 한 헤더파일을 include할 시, 그 헤더파일에 있는 전역변수가 각각의 .c파일에 붙여넣기 되었고, 2로인해 오류를 뱉어내는 것 입니다.
예를 들어보겠습니다.
다음과 같이 foo.c, bar.c, head.h가 있다고 합시다.
// foo.c
#include "head.h"
void foo()
{
printf("foo!");
}
//bar.c
#include "head.h"
void bar()
{
printf("bar!");
}
//head.h
#include <stdio.h>
char* easyStrings[]={ // 전역변수로 선언된 easyStrings
"~~~~~~~~~~~",
"~~~~~~~~~~~~",
"~~~~~~~~",
"~~~~~~~~~~"
}
foo.c와 bar.c는 다음과 같아집니다.
//foo.c
#include <stdio.h>
char* easyStrings[]={ // 전역변수로 선언된 easyStrings
"~~~~~~~~~~~",
"~~~~~~~~~~~~",
"~~~~~~~~",
"~~~~~~~~~~"
}
void foo()
{
printf("foo!");
}
//bar.c
#include <stdio.h>
char* easyStrings[]={ // 전역변수로 선언된 easyStrings
"~~~~~~~~~~~",
"~~~~~~~~~~~~",
"~~~~~~~~",
"~~~~~~~~~~"
}
void bar()
{
printf("bar!");
}
foo.c와 bar.c에 동일한 변수인 char* easyStrings[]가 선언되어 있습니다. 전역변수에 같은 초기화값을 가지고있네요!
이때 LNK 2005, LNK 1169 에러를 뱉어냅니다.
저는 제가 만든 코드인 rankGame.c 에 easyStrings변수를 선언하지 않았는데 자꾸 rankGame.obj에 선언되어 있다고 해서 알게되었습니다. 헤더파일에 있는 easyStrings를 주석처리하니 오류가 없어져서 easyStrings는 다른 헤더파일에 따로 빼두려고 합니다.
여러분 모두 파이팅 하시길 바랍니다!
'프로그래밍 > C' 카테고리의 다른 글
(VS C++ 2019) 포인터 Tip.1 포인터와 증감 연산자 (0) | 2021.06.03 |
---|