반응형


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

    + Recent posts