2011-09-12 8 views
0

다른 프로젝트에서 사용할 수있는 C++로 DLL을 만들려고합니다.C++ DLL 만들기 : 정적 변수 초기화 문제

#ifdef MYDLL_EXPORTS 
#define MYDLL_API __declspec(dllexport) 
#else 
#define MYDLL_API __declspec(dllimport) 
#endif 

template <typename T, typename C> 
class MYDLL_API MyClass 
{ 
    private: 
     static C *variable; 

    //... 
}; 

인 MyClass.cpp : 내 수업의 하나는이

에서 MyClass.h 같이

#include "stdafx.h" 
#include "MyClass.h" 

template <typename T, typename C> 
C *MyClass<T, C>::variable= NULL; 

을 내가 컴파일 때 "오류 LNK2001 얻을 : 확인되지 않은 외부 기호를 .. . "이 변수에 대해. 이 코드는 DLL을 만들기 전에 완벽하게 작동합니다 ...

제발, 도와주세요.

+0

컴파일러 명령 줄 (보통 '-DMYDLL_EXPORTS')에 MYDLL_EXPORTS를 정의 했습니까? – vanza

+0

더 많은 컨텍스트가 필요합니다. DLL을 컴파일하고 동일한 컴파일러를 사용하여 DLL에 연결하고 있습니까? C 코드와 C++ 코드를 인터페이스합니까? – Michael

답변

1

템플릿 클래스를 DLL에 넣을 수 없습니다. 템플릿 클래스의 실제 유형을 지정할 때 클래스의 실제 코드가 컴파일러에서 생성됩니다 (STL이 소스 코드로 제공되는 이유입니다) .

.h 파일을 만들고 거기에 모든 구현을 추가하십시오. 다른 프로젝트가 사용하는 유형, 확실히 알고 있다면, 당신은 명시 적 인스턴스화를 사용할 수 있습니다

// MyClass.h 
template <typename T, typename C> 
class MyClass 
{ 
    private: 
     static C *variable; 

    //... 
}; 

template <typename T, typename C> 
    C *MyClass<T, C>::variable= NULL; 


// OtherProject.cpp 
#include "MyClass.h" 
// ... 
MyClass<int, char> instance; //... 

, 단지 뭔가를 추가 : 다른 프로젝트에서 그것을 포함 MyClass.cpp를

// explicitly instantiate class 
template class MyClass<int, char>; 

+0

대단히 감사합니다! – Marshall

+0

문제가 없습니다. 즐기세요! :) –