본문 바로가기

Programming/ErrorList

[C/C++]LNK2005

작업 환경은 visual studio 2010 에서 작업 했으며, 언어는 C/C++ 입니다.

"중복된 선언이 있습니다…" 사실 이러한 부분은 여러 개의 head 파일들이 서로가 서로를 참조하게 되는 것이 가장 큰 원인으로 알고 있었고, 코딩을 하면서는 중복 선언이 되지 않도록 하는대에 주안점을 두고 작업 했음에도 불구하고 오류! ㅠㅠㅠㅠㅠ(왠지 눙물이 나네…)

이 오류를 접한 프로젝트의 구성은 아래와 같았어요. 제가 직접 만든 행렬 클래스 헤더파일이 별도로 선언해 놓은 임시 행렬클래스 변수를 가지고, main에서는 그 헤더파일을 인클루드…

코드는 아래와 같습니다.
// MAT.h
// .. 생략 ..
class MAT
{
	// 생략..
};

namespace VAL_MAT
{
	// MAT와 관련된 기본 변수 집합
	
	MAT tempRotationMat; // 메모리 재사용을 위한 회전행렬용 변수
	
	// 생략..
}

// main.cpp
#include "MAT.h"

int main()
{
	return 0;
}


그리고 이 과정은 정적 라이브러리(.lib)를 이용하는 과정에서 일어난 에러에요. MAT.h와 main.cpp가 같은 폴더에 있는 게 아니랍니다.


정적 라이브러리 만들어서 사용하는 방법은 포스팅 하려고 했는데, 적절한 예시가 생각이 안나서 잠정 보류중인 상태 에요^-^;;;;; 이게 뭔지 알고 싶으신 분들은 검색을 통해서 알아 보시는게 빠를거 같아요ㅠ

어째든 이 일을 어찌 할꼬… 하면서 구글링과 함께 여러 블로거들의 사이트들을 돌아 다니면서..


이 내용과는 전혀 무관한, 다른 부분에서 해결책을 찾았어요. 바로 static 키워드 :D!

프로그램이 구동되는 와중에 한번 메모리에 올라가게 되면, 해당 변수명이 고정되면서, 다시 메모리에 올라가지 않는거죠. 예전에 기본적인 언어 공부를 하면서 global 변수이면서 지역 변수 같은 녀석을 생성해 준다고 배웠었는데, 이 기본적인 거를 까먹고 있었다니..ㅠㅠㅋ

물론, tempRotationMat이란 변수는 타입까지 정확히 "MAT VAL_MAT::tempRotationMat"이기 때문에 다른 곳에서 tempRotationMat이란 이름을 사용한다고 해서 중첩된다고 나오지는 않아요. 그게 바로 namespace!
(이 부분은 어차피 짧으니까 잠시 포스팅을 해볼까 생각 중이에요ㅎ)

 namespace에서도 별 무리없이 작동 하더군요.

이 후에 저런 클래스 별 특별하게 사용되는 변수들 앞에는 모두 static 키워드를 붙여 넣었죠ㅠ

이제 다시 빌드&테스트!


깔끔하게 성공~ ㅎㅎ 

물론 이 부분에서 너무 많은 클래스들이 동시다발적으로 저 변수를 사용하게 되면 잘 못된 결과를 도출하게 되겠죠.(특히 thread 사용시ㅋ) 아직 까지 그런 단계는 아니기 때문에 크게 생각하고 있지는 않지만, 추후에 세마포어나 모니터를 사용해서 락기능을 넣어줘야 할 듯 해요:D