静态库与动态DLL中的静态变量

时间:2014-06-06 14:17:34

标签: c++ dll mfc static-libraries dynamic-linking

我不太确定如何提出这个问题,所以如果我对某些事情不清楚,请发表评论。

我有一个使用名为CManager的自定义类的项目。我在这个项目中的大多数类都继承自这个类,并且在CManager()(构造函数)中,我将一个添加到CManager对象的计数中,count是这个类中的静态变量。现在,这个项目曾经被编译为.dll(动态库),但我的雇主要求我这次将它编译为.lib,同时剥离了大量的代码。现在我已经删除了所有不需要的代码并编译它而没有错误......但是,当我创建一个.lib时,当我尝试执行程序时,我得到一个错误,说有一个未处理的访问违规阅读。这是代码

int CManager::m_count = 0;

CManager::CManager()
{
    ++m_count;    <- Exception here
}

我不知道为什么会出现这个错误。 m_count是在.h中声明的私有静态int变量。 由于我不明白为什么它不起作用,我尝试将项目编译为.dll,这样我就什么都不做了。出于某种原因......它奏效了。它编译并执行(run,wtv)。

现在我的问题是......为什么会这样?是什么解释了这个?

PS:该项目必须包括其他5个项目&#39; .lib(或dll),但无论如何都可以。这个项目是我的主要包含的,当我尝试执行我的主程序时,我得到了错误。该项目只是一堆算法,我的主要应用程序是GUI。我的主要应用程序是一个MFC应用程序。

谢谢!

编辑1: 在调试时,我发现如果我使用静态库导入项目,当从我的main函数调用传递给.lib实现时,我松开了对象:我在我的对象上调用一个函数,当我和#39; m在函数中,this(引用对象)的值为null。 如果我使用了一个DLL,它可以很好地工作。当对象调用函数时,该对象保持其值。

但我仍然想使用.lib,所以我不知道为什么会发生这种情况以及如何修复它。

1 个答案:

答案 0 :(得分:0)

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

还要确保运行时库和MFC的一般用途兼容,请查看here以获取详细信息。 我还不确定如何使用MT创建的问题,但至少我现在可以运行我的程序了。