VC++ 2005 에서 LNK2019 오류를 얻을 수 있다.

Breaking Changes in the Visual C++ 2005 Compiler (C++)( https://msdn2.microsoft.com/ko-kr/library/ms177253(VS.80).aspx ) 는 VC++ 2005 이전 version과는 다른 behavior 를 갖는 항목에 대해서 언급이 되어있는 데, 간혹, 이러한 차이 때문에 VC++ 2003에서는 정상적으로 Compile 이 되던 Project가 VC++ 2005에서는 Link Error가 발생하는 등의 현상을 겪을 수 있습니다. 예를 들어, 다음과 같은 LNK2019 오류를 경험할 수 있습니다.

LNK2019 오류는 일반적으로 프로젝트가 참조하는 외부 DLL 파일에 사용하는 function이 정의되어 있지 않거나 혹은 Export되지 않았기 때문에 발생합니다

 

오류발생시에 메시지를 확인해보면 다음과 같은 외부함수를 참조하고자 시도 합니다. 아래 내용은 C++ Naming Mangling 규칙에 의해 encoding되며, 함수 이름 이하의 기호 및 문자들은 해당 함수의 return type 및 parameter type을 근간으로 결정됩니다.

?osTHcreate@@YAIPBDHP6GIPAX@Z1PB _W_N@Z – (1)

그러나 실제로 참조 되고 있는 DLL 파일에서 export 하고 있는 함수는 다음과 같은 signature를 가지고 있습니다.

?osTHcreate@@YAIPBDHP6GIPAX@Z1PBG_N@Z – (2)

이러한 불일치로 인해 LNK2019 오류가 발생하고 있습니다. (1) 의 PB_W 는 wchar_t * 를 의미하며 (2) PBG 는 unsigned short *를 의미합니다. 이 둘은 동일하게 2 byte의 메모리 공간을 필요로 하는 자료형이나, Visual Studio 2005는 wchar_t * 와 unsigned short * 를 명시적으로 구분하기 때문에 Link 오류가 발생합니다. wchar_t 와 unsigned short 를 명시적으로 구분하는 것을 방지하기 위해서는 다음과 같이 Project의 속성을 wchar_t 를 C/C++의 내부자료형으로 사용하지 않도록 구성하면 됩니다.

To set this compiler option in the Visual Studio development environment

  1. Open the project's Property Pages dialog box. For details, see Modifying Project Settings.

  2. Click the C/C++ folder.

  3. Click the Language property page.

  4. Modify the Treat wchar_t as Built-in Type property.