当一个 DLL 被多次链接时,导出的全局变量会发生啥?

Posted

技术标签:

【中文标题】当一个 DLL 被多次链接时,导出的全局变量会发生啥?【英文标题】:What happens to exported global variables when a DLL is linked in multiple times?当一个 DLL 被多次链接时,导出的全局变量会发生什么? 【发布时间】:2011-06-29 12:16:37 【问题描述】:

假设我有一个X.DLL,头文件中有以下内容:

extern __declspec(dllexport) int foobar;

这个foobar 全局变量随后在一个实现文件的X.DLL 中定义:

int foobar = 1;

现在假设我有两个 DLL,A.DLLB.DLL,它们链接到 X.DLL,以及一个使用 A.DLLB.DLL 的应用程序 E.EXE

          +----> A.DLL ----+
          |                |
E.EXE ----+                +----> X.DLL
          |                |
          +----> B.DLL ----+

在这种情况下,表达式&foobarfoobar 的地址)在A.DLLB.DLL 内部计算时是否保证具有相同的值?也就是说X.DLL的全局变量是存储了两次还是整个过程中只有一个foobar的实例?此外,如果在加载时链接 DLL 或通过调用 LoadLibrary 链接 DLL,是否会有所不同?

我也对 GCC 的 documentation for dllimport 中的这句话感到困惑:

使用此属性的一个缺点是指向标记为dllimport变量的指针不能用作常量地址。

考虑到我前面提到的情况,我不太明白该声明的含义。

【问题讨论】:

【参考方案1】:

只有一份。但是,总的来说,这样做是一个非常糟糕的主意,您会遇到很多问题。

【讨论】:

以上是关于当一个 DLL 被多次链接时,导出的全局变量会发生啥?的主要内容,如果未能解决你的问题,请参考以下文章

Windows中的库编程

调试实战 —— dll 加载失败之全局变量初始化篇

调试实战 —— dll 加载失败之全局变量初始化篇

DLL 缓存问题

如何使用公开导出的全局 DLL 变量?

Java中static问题