混合共享/静态库时静态成员的多个副本

时间:2012-12-13 22:43:09

标签: c++ visual-c++ inheritance shared-libraries

情况:

我有:

class Platform {

public:
   Platform() { count++; cout << getCount();}
   static int getCount() { return count; }

private:
   static int count;

}

创建为静态库。

考虑制作动态图书馆扩展

class __declspec(dllimport/dllexport) DerivedPlatform : public Platform {

}

是的,我知道我是从非dll接口类派生的。

Per:Are static fields inherited?,应该只有一个计数实例。

这是一个棘手的部分,我实际上最终得到两个不同的计数副本(即使count被声明为静态)。即,在加载dll并调用registerPlatforms()时,它会递增一个不同的计数对象:

int main() {

   Platform::count = 0;
   Platform A; // increases count by 1, cout shows 1

   loadPlugin(); // loads the shared library DerivedPlatform
   DerivedPlatform D; // increases count by 1 again, cout shows 2

   cout << Platform::getCount(); // shows 1 !!!!!!

}

我不知道如何解决这个问题,即。如何确保只有一个静态变量持续存在。显然,DLL有自己的静态变量堆 - 所以有意义的是为什么会发生这种情况。

1 个答案:

答案 0 :(得分:4)

是的,当您将静态库链接到可执行文件和DLL时会发生这种情况。在链接时没有对对方有任何了解,所以他们都得到了副本。对于通常不会伤害任何东西的代码本身,但对于静态变量,它可能是一个真正的麻烦。

您需要重新构建解决方案,以便静态库位于DLL中,而不是现有的或全新的第三个。或者消除所有静态变量。