【发布时间】:2014-06-06 14:17:33
【问题描述】:
我不太清楚如何问这个问题,所以如果我对某些事情不清楚,请发表评论。
我有一个项目,它使用一个名为 CManager 的自定义类。我在这个项目中的大多数类都继承自这个类,并且在 CManager()(构造函数)中,我将 CManager 对象的计数加一,计数是此类中的静态变量。现在,这个项目曾经被编译为 .dll(动态库),但我的雇主这次让我将其编译为 .lib,同时剥离了很多代码。现在我已经剥离了所有不需要的代码并编译它没有错误......但是,当我创建一个 .lib 时,当我尝试执行程序时出现错误,说存在未处理的访问冲突读。这是代码
int CManager::m_count = 0;
CManager::CManager()
{
++m_count; <- Exception here
}
我不知道为什么会出现此错误。 m_count 是在 .h 中声明的私有静态 int 变量。 因为我不明白为什么它不起作用,所以我尝试将项目编译为 .dll,这样我就什么也不做。出于某种原因……它奏效了。它编译并执行(运行,wtv)。
现在我的问题是……为什么会这样?这是什么原因?
PS:该项目必须包含 5 个其他项目的 .lib(或 dll),但无论哪种方式都可以。这个项目包含在我的 main 中,当我尝试执行我的 main 时,我得到了错误。该项目只是一堆算法,我的主要应用程序是 GUI。我的主要应用是 MFC 应用。
谢谢!
编辑 1: 在调试时,我发现如果我使用静态库导入项目,当从我的 main 函数调用传递到 .lib 实现时,我会丢失对象:我在我的对象上调用一个函数,当我在函数,this(引用对象)的值为空。 如果我使用 dll,它会完美运行。对象在调用函数时保持其值。
但我仍然想使用 .lib,所以我真的不知道为什么会发生这种情况以及如何解决它。
【问题讨论】:
-
我的变量被明确使用了,不是吗?
-
当您说 "变量 [is] 在 .h 中定义" 时,您实际上是指 defined 而不是 declared ?
-
对不起,我的意思是声明,我会编辑。
-
发布的代码中没有任何内容会导致问题。使用
this == NULL进入函数的唯一方法是在调用函数的地方出现问题。
标签: c++ dll mfc static-libraries dynamic-linking