4

情况:

我有:

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:静态字段是继承的吗?,应该只有一个 count 实例。

这是棘手的部分,实际上我最终得到了两个不同的 count 副本(即使 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 有它们自己的静态变量堆——所以为什么会发生这种情况是有道理的。

4

1 回答 1

4

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

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

于 2012-12-13T23:32:13.057 回答