Visual C++로 개발을 할 때, 혹은 다른 버전의 프로젝트를 컨버전할 때 가장 많이 겪는 문제는 빌드 환경 잡는 문제인 것 같다.

참조 라이브러리에 따라, 버전에 따라, 실행 환경(Win32/x64)에 따라, 쓰레딩 방법에 따라, 코드페이지(유니코드/멀티바이트)에 따라,

아무튼 갖가지 이유에 의해 수많은 오류들을 만나게 된다.


대부분의 초보 개발자들은 컴파일 오류까지는 어떻게 어떻게 애써 따라가보다가

링크 오류를 만나는 순간 멘붕을 겪고 "이건 불가능"이란 답을 성급하게 도출해낸다.


안습ㅜ.ㅜ


모든 오류에 적용될 수는 없겠지만 가장 심각한 멘붕을 겪는 두 가지 링커 오류에 대처하는 법을 살펴보도록 하겠다.



1. LNK 2019


정의되지 않은 외부 기호({symbol})를 {function}에서 발견했습니다


대략 뭐 이런 오류인데,

여기서 _stdcall, _thiscall, _cdecl 같은 기호들을 굳이 해석해서 Calling Convention에 무슨 문제가 있는건가, 같은 생각은 할 필요 없다.

적어도 C/C++ 코드를 보고 있는 거라면. (아 물론 Assembly, Inline assembly 등의 코드를 Reversing 등의 이유로 보고 있는 거라면 당연히 관련 문제도 염두에 두긴 해야 한다.)


>> 참조: http://msdn.microsoft.com/en-us/library/799kze2z(v=vs.100).aspx


이 오류의 대부분은 링커 - 입력 화면(VS2010 기준)에서 추가 종속성에 관련 라이브러리(.lib)를 입력해주는 것으로 해결된다.

필요한 라이브러리가 없기 때문에 생기는 오류가 대부분이란 얘기다.




2. LNK 2001, LNK 2005


error LNK2005: {object}에 이미 정의되어 있습니다.
error LNK2001: {function} 외부 기호를 확인할 수 없습니다.



이 경우는 조금 애매하다.


>> 참조: http://msdn.microsoft.com/en-us/library/72zdcz6f(v=vs.100).aspx


보통은 잘 나지 않는 오류인데,

DLL로 만들고 멀티쓰레드로 빌드하려고 할 때 가끔 볼 수 있는 오류다.


아래 URL을 참조해보면 답이 대충 짐작될 수 있다.


>> 참조: http://bestend.co.kr/189


컴파일 옵션 중 링크할 런타임 라이브러리를 어떻게 링크할 것인가에 따라 사용되는 기본 라이브러리가 다른데,

/MD, /MT 어떤 옵션을 쓰느냐에 따라 MSVCRT가 필요하거나 LIBCMT가 필요하게 된다는 사실을 기억하면 도움이 된다.


즉, /NODEFAULTLIB:{lib} 옵션을 적절히 사용하거나 사용 해제해주면 이 오류들을 피할 수 있다.


예를 들어, /MD(다중 쓰레드 DLL) 옵션이 걸려 있는데 링커 옵션에 /NODEFAULTLIB:MSVCRT 옵션이 같이 걸려 있으면 LNK 2001 오류가 발생한다. /MD 옵션은 MSVCRT를 필요로 하기 때문이다.


또는, /MT(다중 쓰레드) 옵션이 걸려 있는데 링커 옵션에 /NODEFAULTLIB:MSVCRT 옵션이 없으면 LNK 2005 오류가 발생할 수 있다.


적절히 참조해서 수정하면 해결할 수 있다.



Posted by 떼르미
,


자바스크립트를 허용해주세요!
Please Enable JavaScript![ Enable JavaScript ]