【问题标题】:Static variables in static lib vs dynamic dll静态库中的静态变量与动态 dll
【发布时间】: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


【解决方案1】:

我找到了。就像 Mark Ransom 在 cmets 中所说,问题不在于代码,而在于我的项目属性。我正在创建一个 .lib 而不是 dll,但没有相应地更改运行时库。所以在项目属性 -> C/C++ -> 所有选项 -> 运行时库中,我开始使用 MD 并且它起作用了。

还要确保运行时库和 MFC 的一般用途兼容,详情请查看here。 我仍然不确定使用 MT 是如何产生问题的,但至少我现在可以运行我的程序了。

【讨论】:

  • 我喜欢做对,但在这种情况下,我只猜对了一半。我仍然认为问题出在代码中,而不是项目设置中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-05
  • 1970-01-01
  • 2011-09-12
  • 1970-01-01
相关资源
最近更新 更多