让Loki Singleton在VS 2008 C ++中的DLL中工作

时间:2009-06-17 14:57:52

标签: c++ visual-studio-2008 loki

我很确定这个问题并不新鲜,而且很确定它很难解决。希望我对后者不对。

我正在尝试在我的程序中使用Modern C ++ Design中的Loki :: Singleton。

然而,我似乎无法让它跨DLL工作。我想我知道为什么会这样:模板化的代码在每个源模块中实例化,因此每个模块都有自己的全局变量,而不是一个全局变量。

显然,这使得Singleton非常单一。

有没有办法绕过这种行为?

3 个答案:

答案 0 :(得分:2)

我在Loki源目录中看到他们有一个特定的SingletonDLL directory被测试,看起来他们使用一个导出的,显式实例化的模板(这将起作用)。希望它包含您想要的代码。

答案 1 :(得分:1)

请注意,这不会解决问题。显式实例化和导出的单例应该可以解决这个问题...

-Rick

基本上查看#pragma data_seg here,您需要在代码的共享部分中声明单例的实例。默认情况下,静态范围限定为dll。

模板可能会变得棘手,但这是成功的途径,不涉及传递/复制静态数据。

答案 2 :(得分:0)

你可能是正确的,每个DLL都有自己的单例实例。我对Loki的实现并不熟悉,source code并不是很有趣。

可能的解决方案是:

  • 不使用单身人士。这实际上是我通常的偏好,因为您可以通过将设计更改为不需要它来避免整类问题。对于为什么单身人士可能有害的长期咆哮,请参阅this Yegge帖子。我并不是强烈反对他们,但95%的时候,单身人士引发的问题多于他们解决的问题(如果他们真的解决了问题)
  • 跨DLL边界复制静态成员。我还将其作为一个hack来完成,其中DLL从应用程序或另一个DLL获取指针,并将其自己的静态类成员副本重置为从外部传递的指针。它是邪恶的,它很脏,你不能在它之后清理,但它确实有用。