动态链接库中类的静态成员变量导致其它使用者链接错误怎么办?

jsjszg 2007-05-22 10:29:50
动态链接库中类包含静态成员变量
class __declspec(dllexport) MyClass
{
...
protected:
static MyClass* m_Instance
...
}
静态成员变量在该类的cpp文件中都有重新声明,因此,整个动态库编译正常,但提供我的主程序用时却出现100个类似的错误:
error LNK2001: unresolved external symbol "protected: static class MyClass* MyClass::m_Instance " ......
请问这该如何解决?
...全文
1511 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
titer1 2012-08-23
  • 打赏
  • 举报
回复
@原来 在dll中包含 静态变量有这个讲究! 学习了~~
titer1 2012-08-23
  • 打赏
  • 举报
回复
@原来 在dll中包含 静态变量有这个讲究! 学习了~~
neicole 2012-08-22
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]
这是由于导出类的修饰错误,对于dll本身来讲,修饰应该是__declspec(dllexport),而对于调用者来讲,应该是__declspec(dllimport)。而为了正确的编译修饰,可以声明如下:
#ifdef MY_DLL_EXPORT
#define _DLL_EXPORT_ __declspec(dllexport)
#else
#define _DLL_EXPORT_ __declspec(dllimport)
#endif
将MY_DLL_EXPORT加到dll 工程的预编译定义中。
现在你可以使用_DLL_EXPORT_宏来修饰你任何想导出的类或函数了。
如果再搞不定,你可以将你的代码发给kempniu@gmail.com,我将会及时帮你搞定。祝你好运!
[/Quote]

7楼万岁~
试用了方法,成功了。
obsogn 2011-11-17
  • 打赏
  • 举报
回复
很崩溃的遇到这个问题,折腾了一天,终于在这找到解决办法了,johnxt和vcstorm发的帖子很有用,需要__declspec(dllimport)一下
akspusd 2011-08-06
  • 打赏
  • 举报
回复
johnxt 的方法不错。
sinfee 2011-02-18
  • 打赏
  • 举报
回复
不建议在DLL中使用静态变量,这样可能会出现编译时没有问题,
但使用过程中可能会出现崩溃现象,其实你定义一个全局变量,头
文件中extern一下就可以了,与静态变量同样的效果
vcstorm 2011-02-16
  • 打赏
  • 举报
回复
http://blog.pfan.cn/article.asp?id=52124
shuice 2009-01-14
  • 打赏
  • 举报
回复
静态变量不能跨DLL
classrect 2009-01-04
  • 打赏
  • 举报
回复
今天老夫也遇到了同样的问题. 也是一个单件类.............

用了 johnxt 的方法可以了. 多亏这帖子. 楼主自己可以试试

引用这个dll要有导入声明 __declspec(dllimport)

用一个预编译定义来决定

感谢johnxt.
oo_v_oo 2008-09-26
  • 打赏
  • 举报
回复
这都什么什么

BS
sheng__ye 2008-09-26
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 johnxt 的回复:]
以上的回答都是些水货发表的。这么简单的问题还搞了半天,真是可笑。我的解答如下:
这是由于导出类的修饰错误,对于dll本身来讲,修饰应该是__declspec(dllexport),而对于调用者来讲,应该是__declspec(dllimport)。而为了正确的编译修饰,可以声明如下:
#ifdef MY_DLL_EXPORT
#define _DLL_EXPORT_ __declspec(dllexport)
#else
#define _DLL_EXPORT_ __declspec(dllimport)
#endif
将MY_DLL_EX…
[/Quote]
问题没搞清就是说别人是水货,我看楼上发的才是初级言论。
楼主的问题恐怕和编译器有一定关系。
VS2005下,如果是const静态成员变量,直接在类声明里初始化。然后导出类即可。
非静态的俺就不知道了,还望高手指点。
man28 2007-07-19
  • 打赏
  • 举报
回复
也可能你把静态变量的定义和初始化放在头文件里了,应该把他们放在cpp文件里,偶曾犯过这样的错误
johnxt 2007-07-05
  • 打赏
  • 举报
回复
我的解答如下:
这是由于导出类的修饰错误,对于dll本身来讲,修饰应该是__declspec(dllexport),而对于调用者来讲,应该是__declspec(dllimport)。而为了正确的编译修饰,可以声明如下:
#ifdef MY_DLL_EXPORT
#define _DLL_EXPORT_ __declspec(dllexport)
#else
#define _DLL_EXPORT_ __declspec(dllimport)
#endif
将MY_DLL_EXPORT加到dll 工程的预编译定义中。
现在你可以使用_DLL_EXPORT_宏来修饰你任何想导出的类或函数了。
如果再搞不定,你可以将你的代码发给kempniu@gmail.com,我将会及时帮你搞定。祝你好运!

johnxt 2007-07-05
  • 打赏
  • 举报
回复
以上的回答都是些水货发表的。这么简单的问题还搞了半天,真是可笑。我的解答如下:
这是由于导出类的修饰错误,对于dll本身来讲,修饰应该是__declspec(dllexport),而对于调用者来讲,应该是__declspec(dllimport)。而为了正确的编译修饰,可以声明如下:
#ifdef MY_DLL_EXPORT
#define _DLL_EXPORT_ __declspec(dllexport)
#else
#define _DLL_EXPORT_ __declspec(dllimport)
#endif
将MY_DLL_EXPORT加到dll 工程的预编译定义中。
现在你可以使用_DLL_EXPORT_宏来修饰你任何想导出的类或函数了。
如果再搞不定,你可以将你的代码发给kempniu@gmail.com,我将会及时帮你搞定。祝你好运!
eduyu 2007-06-15
  • 打赏
  • 举报
回复
加个__declspec(dllexport) MyClass* MyClass::m_Instance;试试
fantiyu 2007-06-14
  • 打赏
  • 举报
回复
没碰到过你的问题,不是很清楚
看样子像是编译器没找到实体
你在外部重新定义一个实体试试看 - -#


-------------------------------------------------------
广告:VC/WinAPI 网络/多线程讨论 QQ群, 群号:41356711
jsjszg 2007-06-14
  • 打赏
  • 举报
回复
可能问题没有说清楚.重新整理下吧
========================================

动态链接库中类包含静态成员变量
class __declspec(dllexport) MyClass
{
...
protected:
static MyClass* m_Instance
...
}
在cpp文件中对静态成员变量实例化声明
MyClass* MyClass::m_Instance = NULL;

整个动态库编译正常

====================================================

在外部程序中调用这个Dll的MyClass类.
MyClass oneClass;

编译外部程序的时候,出现链接错误:
error LNK2001: unresolved external symbol "protected: static class MyClass* MyClass::m_Instance " ......


请问这该如何解决?
jsjszg 2007-06-12
  • 打赏
  • 举报
回复
我开始的时候已经在cpp中进行实例化声明了:MyClass* MyClass::m_Instance=NULL;
问题依旧.
fantiyu 2007-06-12
  • 打赏
  • 举报
回复
忘记说了,那行代码放到你dll的.cpp文件里,别放进.h
fantiyu 2007-06-12
  • 打赏
  • 举报
回复
在class外面进行实例化声明:
MyClass* MyClass::m_Instance;

-------------------------------------------------------
广告:VC/WinAPI 网络/多线程讨论 QQ群, 群号:41356711

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧