动态链接 DLL 需要与其调用者共享一个全局变量

Posted

技术标签:

【中文标题】动态链接 DLL 需要与其调用者共享一个全局变量【英文标题】:Dynamic-linked DLL needs to share a global variable with its caller 【发布时间】:2010-05-12 14:06:15 【问题描述】:

我有一个静态库libStatic,它定义了一个像这样的全局变量

头文件libStatic/globals.h:

extern int globvar;

代码文件libStatic/globals.cpp:

int globvar = 42;

DLL libDynamic 和可执行文件runner 正在使用这个全局变量。此外,libDynamic 在运行时链接到 runner(通过 LoadLibrary()GetProcAddress() 和工作......)

我知道这将导致globvar 被创建两次,一次在 runner 的堆中,一次在 libDynamic 的堆中,这当然是非常不可取的.

这附近有什么好办法吗?如何确保 libDynamicrunner 使用相同的globvar

【问题讨论】:

必须使用全局变量吗?或许你能想出更好的方法来绕过这种状态? 这个例子被简化了很多,以免问题过于复杂。实际上,它不仅仅是一个简单的 int 变量,而是一个复杂的单例对象。我正在寻找一种方法来确保单例在应用程序和动态库的组合范围内仅存在一次。 【参考方案1】:

一个简单的方法是让.DLL 指向可执行文件的全局变量。加载后,您将在该库中调用一个特殊函数(类似于SetGlobVar(int*))。这样,库将始终指向与 .EXE 相同的全局变量。

【讨论】:

我担心我会得到这个答案......虽然它是 100% 正确的,但我不喜欢这种必要性,如果存在,我更喜欢更优雅的方式。 将全局变量移动到一个单独的模块 (dll) 中,可以由两者动态链接(不是运行时链接!动态链接)。使用nifty counter pattern 作为全局变量。对于您的需求,这可能有点过头了,但这就是 basic_iostream 库创建 cout 及其朋友的方式。

以上是关于动态链接 DLL 需要与其调用者共享一个全局变量的主要内容,如果未能解决你的问题,请参考以下文章

方法如何访问调用者的属性?

调用者看不到函数中的变量更改?

DLL动态链接库如何共享数据和如何创建纯资源DLL

动态链接的步骤

C++ 静态库中的共享全局变量

DLL隐式链接