2010-01-07 5 views
1

나는이처럼 MFC 확장 DLL에 싱글을 선언싱글 MFC 확장 DLL

 
//header file: SingleTon.h 
class AFX_EXT_CLASS CMySingleton 
{ 
public: 
    static CMySingleton* Instance() 
    { 
    if(!singleton) 
     singleton = new CMySingleton(); 
    return singleton; 
    } 

    int a; 

// Other non-static member functions 
private: 
    CMySingleton() {};         // Private constructor 
    CMySingleton(const CMySingleton&);     // Prevent copy-construction 
    CMySingleton& operator=(const CMySingleton&);  // Prevent assignment 
    virtual ~CMySingleton() {}; 

    static CMySingleton* singleton; 
}; 

And in a cpp file I code the following line: 

CMySingleton* CMySingleton::singleton = NULL; 

코드 2 :

 
CMySingleton *a; 

a = CMySingleton::Instance(); 

문제는 때 정규 코드 "코드 2" DLL이 모두 잘 작동하지만 내가 다른 MFC 확장에서 "코드 2"를 코딩 할 때 DLL 오류 제공합니다 모든 dependenci을

 
unresolved external symbol "private: static class CMySingleton* CMySingleton::singleton" ([email protected]@@[email protected]) 

내가 제대로 확인을 프로젝트 종속성을 통해

아이디어가 있으십니까?

답변

1

문제는 AFX_EXT_CLASS 매크로에 있습니다.

#ifdef _AFXEXT 
    #define AFX_EXT_CLASS  __declspec(dllexport) 
#else 
    #define AFX_EXT_CLASS  __declspec(dllimport) 
#endif 

확장 dll은 _AFXEXT를 정의하고 클래스가 수출되고 있으며 가져 그래서 주요 애플 리케이션 (또는 일반 DLL을)를 정의하지 않습니다. 하지만 두 번째 확장 dll도 _AFXEXT를 정의하고 클래스 선언은 dllexport 대신 dllimport를 사용하며 링커 오류가 발생합니다.

#ifdef EXTENSION_ONE 
    #define EXT_CLASS_ONE  __declspec(dllexport) 
#else 
    #define EXT_CLASS_ONE  __declspec(dllimport) 
#endif 

이 두 번째 DLL에 대한 EXTENSION_TWO 및 EXT_CLASS_TWO 만들기 :이 솔루션은 모두 DLL을위한 당신의 자신의 매크로를 작성하고 AFX_EXT_CLASS 대신를 사용하는 것입니다. 첫 번째 확장 DLL 프로젝트에서만 EXTENSION_ONE을 정의하고 두 번째 확장 DLL 프로젝트에서는 EXTENSION_TWO를 정의하십시오.

+0

대단한 답변 !! –