正文

类静态成员变量的导出问题2009-06-03 16:01:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/yuqiexing/44113.html

分享到:

编程许久,在使用DLL导出类的时候,用的都是AFX_EXT_CLASS,直到近日,才终于发现这个家伙有点缺陷。     让我们来看这样一个问题:新建一个MFC Extension DLL ,并在其中新建一个类testA。   // testA.h class AFX_EXT_CLASS testA  {public:   testA();   virtual ~testA();public:   static const double PI;};              在头文件中声明了类静态变量PI,并在testA.cpp中进行了初始化。  const double testA::PI = 3.14; 编译通过,生成lib,dll.   试验发现:     如果客户是一般的exe程序,使用PI正常,编译通过。     如果客户是另一个DLL,使用PI的时候编译通过不了,报如下错误: error   LINK2001:   unresolved   external   symbol   ... PI ...      在网上找了好久,没有找到解决方案,只好用全局变量PI来代替,或者使用全局函数来返回PI的值,即  double GetPI(){ return testA::PI;}           有一天终于发现了解决办法:即采用普通的__declspec(dllexport)和__declspec(dllimport),而不采用AFX_EXT_CLASS   // testA.h #ifdef SIMPLEDLL_EXPORT #define DLL_EXPORT __declspec(dllexport)#else#define DLL_EXPORT __declspec(dllimport)#endif class DLL_EXPORT testA  {public: testA(); virtual ~testA();public:  static const double PI; };   // testA.cpp #define SIMPLEDLL_EXPORT #include "testA.h       现在不管客户是EXE还是DLL,只需要包含testA.h, 使用PI正常。       可见问题就是在于AFX_EXT_CLASS了。       经过百般查证,终于找到了部分原因:   The   problem   is   that   in   Win32,   you   must   explicitly   declare   any   data   as   _declspec(dllexport)   if   it   is   to   be   exported   from   a   DLL,   and   declare   any   data   as   _declspec(dllimport)   if   it   is   to   be   imported   from   a   DLL.   When   you   define   _AFXEXT,   the   MFC   headers   make   sure   that   AFX_EXT_CLASS   is   defined   correctly.   When   you   have   multiple   layers,   one   symbol   such   as   AFX_EXT_CLASS   is   not   sufficient   because   an   extension   DLL   may   be   exporting   new   classes   as   well   as   importing   other   classes   from   another   extension   DLL.       希望高手们能详细解释一下具体的原因。 以上实验在VS2008和VC6.0下通过。    

阅读(9682) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册