C++, DLL

에러 내용

XXsss.obj : error LNK2019: "__declspec(dllimport) public: __thiscall NETWORK::NETWORK(void)" (__imp_??0NETWORK@@QAE@XZ) 외부 기호("public: __thiscall XXXSERVER::XXXSERVER(void)" (??0XXXSERVER@@QAE@XZ) 함수에서 참조)를 확인하지 못했습니다.



DLL 측
#ifdef DLLEXPORT
#define DLL_API __declspec(dllexport)
#else
#define DLL_API __declspec(dllimport)
#endif

class DLL_API cBase {
cBase();
virtual cBase();
};




애플리케션 측
#include "Base.h"
#pragma comment(lib,"Base.lib")

class cChild : public cBase {
cChild();
virtual cChile();
};

저작자 표시
신고
by 흥배 2013.03.16 23:53


Windows Server 2003 이후의 OS에서는 애플리케이션이 DLL 128개 이상 로드를 못한다는 것을 아시나요? 전 근래에 우연찮게 트위터의 글을 보다가 알았습니다.

이 때까지 만든 애플리케이션이 128개 이상의 DLL을 로드한 적인 없으니 알도리가 없었죠^^

아래의 글은 128개 이상 DLL을 로드하여 실패가 발생했을 때 해결하는 방법입니다.

 

 

Visual C++ .NET 2003, Visual C++ 2005, 또는 Visual C++ 2008에서 빌드 된 애플리케이션에 128개 이상의 DLL이 포함되는 경우 Windows Server 2003 이후의 OS에서 로드 실패가 발생

 

현상

Microsoft Visual C++ .NET 2003, Microsoft Visual C++ 2005, 또는 Microsoft Visual C++ 2008에서 빌드된 애플리케이션이 128개 이상의 DLL을 로드한 경우 LoadLibrary 함수가 실패한다.

 
이 현상은 Fiber Local Storage(이하 FLS)을 지원했던 Microsoft Windows Server 2003 이후의 OS에서 발생할 가능성이 있다.

 
이 문제가 발생했을 때에 GetLastError 함수에서 얻은 자세한 에러 코드는 다음과 같닫.

 1114 : ERROR_DLL_INIT_FAILED (동적 링크 라이브러리(DLL) 초기화 루틴 실행에 실패했습니다.)

 

 

원인

1 프로세스 마다 FLS의 최대 값은 128이기 때문에 129 이상의 FLS 할당을 하면 이 현상이 발생합니다.

FLS
를 지원하지 않은 OS에서는 Thread Local Storage(이하 TLS)를 사용합니다. Microsoft Windows 2000 이후의 TLS의 최대 값은 1088입니다. FLS은 통상 Fiber 내에 국소적으로 값을 보존하기 위해 사용되어 Thread 보다도 가볍게 처리하므로 TLS 보다도 적은 용량이 설정되어 있습니다.

 

 

회피 방법

애플리케이션에 사용하는 DLL Visual C++ 컴파일 옵션으로 /MT 옵션을 사용하고 있는 경우는 /MD 옵션으로 변경하여 빌드 합니다.

/MT 옵션에서 정적으로 C 런타임 라이브러리를 사용한 경우 각각 모듈마다 C 런타임 라이브러리의 인스턴스가 존재하기 때문에 DLL의 수와 같은 수의 FLS가 할당 됩니다.

 

/MD 옵션으로 동적으로 C 런타임 라이브러리를 사용하는 것에 의해 같은 버전의 C 런타임 라이브러리의 인스턴스가 하나가 되어 FLS DLL의 수에 관계 없이 하나가 할당됩니다.

 

컴파일 옵션의 변경 순서는 다음과 같습니다.

  1. Visual C++ .NET 2003, Visual C++ 2005 또는 Visual C++ 2008의 솔루션 탐색기에서 프로젝트를 연다.
  2. 프로젝트의 [속성 페이지] 다이얼로그 박스를 연다.
  3. [C/C++] 폴더를 클릭한다.
  4. [코드 생성] 속성 페이지를 클릭한다.
  5. [런타임 라이브러리] 속성을 [멀티 스레드 DLL (/MD)] 로 변경한다.

 

 

출처 : http://support.microsoft.com/kb/969933/ja

 

 

저작자 표시
신고
by 흥배 2009.12.30 09:00
| 1 |