【发布时间】:2010-07-06 14:09:05
【问题描述】:
我有一个 MS C++ 项目(我们称之为项目 A),我目前正在将其编译为静态库 (.lib)。它定义了一个全局变量 foo。我有另外两个单独编译的项目(分别称为 B 和 C),每个项目都链接共享静态库 A。B 和 C 都是最终在同一个进程中加载的 dll。我想在同一进程中在 B 和 C 之间共享来自 A 的 foo 的单个实例:单例。我不确定如何在这里使用项目 A 完成单例模式,因为它是分别静态编译成 B 和 C 的。如果我在 B 和 C 中都将 foo 声明为 extern,我最终会在 B 和 C 中得到不同的实例。使用带有静态 getInstance 方法的标准、简单的单例类模式会导致两个静态 foo 实例化。
当项目 A 被静态编译成 B 和 C 时,有什么办法可以做到这一点?还是我必须让 A 成为 DLL?
【问题讨论】:
-
“如果我在 B 和 C 中都将 foo 声明为 extern,我最终会在 B 和 C 中得到不同的实例。” - 这是真的吗?
-
这似乎是真的 - 这是我在调试时单步执行程序时观察到的行为。我看到 foo 的构造函数被调用了两次,并且外部变量 g_Foo 在两个模块 B 和 C 中的地址不同。应该不是这种情况吗?
-
@Zach - 我不这么认为。在这种情况下,变量需要是跨进程的。仅仅因为它在 DLL 中是静态全局的,并不意味着不同的进程映像具有相同的实例。每个图像都有自己的实例。
-
@Ragster,嗯,我认为我当时的问题并不清楚(或者我可能不完全理解你在说什么)。对于给定的进程,我真的只需要一个实例(它不需要跨进程可见)。或者我不太明白你所说的过程图像是什么意思......谢谢!
标签: c++ visual-c++ static global-variables