当一个 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.DLL
和 B.DLL
,它们链接到 X.DLL
,以及一个使用 A.DLL
和 B.DLL
的应用程序 E.EXE
:
+----> A.DLL ----+
| |
E.EXE ----+ +----> X.DLL
| |
+----> B.DLL ----+
在这种情况下,表达式&foobar
(foobar
的地址)在A.DLL
和B.DLL
内部计算时是否保证具有相同的值?也就是说X.DLL
的全局变量是存储了两次还是整个过程中只有一个foobar
的实例?此外,如果在加载时链接 DLL 或通过调用 LoadLibrary
链接 DLL,是否会有所不同?
我也对 GCC 的 documentation for dllimport 中的这句话感到困惑:
使用此属性的一个缺点是指向标记为
dllimport
的变量的指针不能用作常量地址。
考虑到我前面提到的情况,我不太明白该声明的含义。
【问题讨论】:
【参考方案1】:只有一份。但是,总的来说,这样做是一个非常糟糕的主意,您会遇到很多问题。
【讨论】:
以上是关于当一个 DLL 被多次链接时,导出的全局变量会发生啥?的主要内容,如果未能解决你的问题,请参考以下文章