c++ - 当多次链接 DLL 时,导出的全局变量会发生什么情况?

标签 c++ c windows dll

假设我有一个头文件中包含以下内容的 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 ----+

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

我也对 GCC 的 documentation for dllimport 中的这个声明感到困惑:

One drawback to using this attribute is that a pointer to a variable marked as dllimport cannot be used as a constant address.

考虑到我的上述情况,我不太理解该声明的含义。

最佳答案

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

关于c++ - 当多次链接 DLL 时,导出的全局变量会发生什么情况?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6520487/

相关文章:

windows - 从 AWS 上的 EC2 实例共享文件夹 (SMB) 到远程机器

c++ - 如何在 Windows 上使用 C++ 中的 SWIG for D?

c# - python/C++/C#/Java 中两个句子之间的相关性?

c++ - 在不同模板化的类型上实现的链表

c++ - 用 const : Different treatment for int and double 初始化 constexpr

c - visual c++ 与 gcc/clang 中的不同行为,同时对包含逗号的参数进行字符串化

objective-c - 将 C/C++ 文件添加到 Xcode4 iOS 项目

c++ - 使用外部定义的自定义删除器在头文件中定义唯一指针

c++ - 对使用开源第三方库感到困惑

windows - PowerShell 比较-Object SideIndicator