Singleton MFC扩展DLL

时间:2010-01-07 17:36:18

标签: 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();

问题是当我在Regular Dll中编码“code 2”时,一切正常,但是当我在另一个MFC扩展DLL中编码“code 2”时出现错误:

unresolved external symbol "private: static class CMySingleton* CMySingleton::singleton" (?singleton@CMySingleton@@0PAV1@A)

我通过Project Dependencies正确检查所有依赖项。

有什么想法吗?

1 个答案:

答案 0 :(得分: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,你的类声明使用dllimport而不是dllexport,你得到一个链接器错误。解决方案是为两个dll创建自己的宏,并使用它们而不是AFX_EXT_CLASS:

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

为您的第二个dll创建EXTENSION_TWO和EXT_CLASS_TWO。仅在第一个扩展DLL项目中定义EXTENSION_ONE,在仅在第二个扩展dll项目中定义EXTENSION_TWO。