情况:
我有:
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有自己的静态变量堆 - 所以有意义的是为什么会发生这种情况。
答案 0 :(得分:4)
是的,当您将静态库链接到可执行文件和DLL时会发生这种情况。在链接时没有对对方有任何了解,所以他们都得到了副本。对于通常不会伤害任何东西的代码本身,但对于静态变量,它可能是一个真正的麻烦。
您需要重新构建解决方案,以便静态库位于DLL中,而不是现有的或全新的第三个。或者消除所有静态变量。