반응형
LNK4222 경고는 주로 Visual Studio 6.0 에서 개발한 dll 을 2003 이상에서 빌드할 때 발생한다.
6.0 에서는 보통 dll 의 def 파일을 다음과 같이 생성한다.
예를 들어 dll 의 TEST.def 파일이 아래와 같이 되어있다면
DllCanUnloadNow @1 PRIVATE
DllGetClassObject @2 PRIVATE
DllRegisterServer @3 PRIVATE
DllUnregisterServer @4 PRIVATE
Visual Studio 2003 이상의 컴파일러는 다음과 같은 경고를 발생시킨다.
1>.\TEST.def : warning LNK4222: 내보낸 'DllCanUnloadNow' 기호를 서수로 지정하면 안 됩니다.
1>.\TEST.def : warning LNK4222: 내보낸 'DllGetClassObject' 기호를 서수로 지정하면 안 됩니다.
1>.\TEST.def : warning LNK4222: 내보낸 'DllRegisterServer' 기호를 서수로 지정하면 안 됩니다.
1>.\TEST.def : warning LNK4222: 내보낸 'DllUnregisterServer' 기호를 서수로 지정하면 안 됩니다.
( Visual Studio 영문 버전의 경고 문구는 아래와 같다. )
warning LNK4222: exported symbol 'DllRegisterServer' should not be assigned an ordinal
http://msdn.microsoft.com/ko-kr/library/8e705t74(VS.80).aspx
위의 MSDN 을 읽어보면 도움을 얻을 수 있는데, 결과적으로 얘기하자면 6.0 에서 쓰던 것과 같은 서수 표기방식은 아래 함수들에 대해서는 사용하면 안된다. ( 이유 : 기호를 서수로 표기할 경우 실제 사용할 주소 테이블보다 큰 슬롯을 사용할 수 있음 )
그러므로 아래 함수들에 대해서는 서수 표기방식을 사용해서는 안된다.
DllCanUnloadNow
DllGetClassObject
DllGetClassFactoryFromClassString
DllInstall
DllRegisterServer
DllRegisterServerEx
DllUnregisterServer
위의 def 파일 코드는 아래와 같이 고쳐주면 깔끔하게 해결이 된다.
DllCanUnloadNow PRIVATE
DllGetClassObject PRIVATE
DllRegisterServer PRIVATE
DllUnregisterServer PRIVATE
'IT Story > Programming Language' 카테고리의 다른 글
Precompiled header 에 대해서 ( stdafx.h 와 stdafx.cpp ) (8) | 2010.04.28 |
---|---|
C++ 과 C# 의 차이 (6) | 2009.11.02 |
Visual Studio 에서 재미있는 delete 현상 (4) | 2009.03.25 |
디버그 사례 - Visual Studio 6.0 에서 close() 함수 사용시 (2) | 2009.03.18 |
fwrite 와 fprintf 의 차이점 (8) | 2009.02.09 |