我在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正确检查所有依赖项。
有什么想法吗?
答案 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。