2010-01-07 3 views
1

Я объявляю синглтона на расширение DLL MFC, например:Singleton 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, все работает отлично, но когда я код «код 2» в другом расширение MFC DLL выдает ошибку:

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

я правильно проверить все dependenci с помощью зависимостей проекта.

Любая идея?

ответ

1

Проблема заключается в макросе AFX_EXT_CLASS.

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

длл Extension определяет _AFXEXT и ваш класс экспортируется, а главное приложение (или обычный DLL) не определяет его, чтобы он импортируется. Но ваша вторая расширительная dll также определяет _AFXEXT, и ваше объявление класса использует dllimport вместо dllexport, и вы получаете ошибку компоновщика. Решение состоит в том, чтобы создать свой собственный макрос для обеих библиотек DLL и использовать их вместо AFX_EXT_CLASS:

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

Создать EXTENSION_TWO и EXT_CLASS_TWO для второй библиотеки DLL. Определите EXTENSION_ONE только в вашем первом проекте dll расширения и EXTENSION_TWO только в вашем втором проекте расширения dll.

+0

Отличный ответ !!. –

Смежные вопросы