【发布时间】:2023-03-20 11:47:01
【问题描述】:
我试图了解当具有全局变量和静态变量的模块动态链接到应用程序时会发生什么。 我所说的模块是指解决方案中的每个项目(我经常使用 Visual Studio!)。这些模块要么内置在 *.lib 或 *.dll 中,要么内置在 *.exe 本身中。
我了解应用程序的二进制文件包含数据段中所有单个翻译单元(目标文件)的全局和静态数据(如果为 const,则为只读数据段)。
当此应用程序使用具有加载时动态链接的模块 A 时会发生什么?我假设 DLL 有一个用于其全局和静态的部分。操作系统会加载它们吗?如果是这样,它们会被加载到哪里?
当应用程序使用具有运行时动态链接的模块 B 时会发生什么?
如果我的应用程序中有两个同时使用 A 和 B 的模块,是否按如下所述创建 A 和 B 的全局变量的副本(如果它们是不同的进程)?
DLL A 和 B 是否可以访问应用程序全局变量?
(请同时说明理由)
引用MSDN:
在 DLL 源代码文件中声明为全局的变量被编译器和链接器视为全局变量,但每个加载给定 DLL 的进程都会获得自己的该 DLL 全局变量的副本。静态变量的范围仅限于声明静态变量的块。因此,默认情况下,每个进程都有自己的 DLL 全局变量和静态变量实例。
来自here:
当动态链接模块时,可能不清楚不同的库是否有自己的全局实例或全局是否共享。
谢谢。
【问题讨论】:
-
通过 modules 你可能是指 libs。有一个提议将 modules 添加到 C++ 标准中,对模块的定义和语义比现在的常规库有更精确的定义。
-
啊,应该澄清一下。我将解决方案中的不同项目(我经常使用 Visual Studio)视为模块。这些模块内置在 *.lib 或 *.dll 中。
-
@DavidRodríguez-dribeas 术语“模块”是独立(完全链接)可执行文件的正确技术术语,包括:可执行程序、动态链接库 (.dll) 或共享对象 (.so )。在这里用得恰到好处,意思是正确的,很好理解。正如我所解释的,在有一个名为“模块”的标准功能之前,它的定义仍然是传统的。
标签: c++ linker global-variables global dynamic-linking