DLL多次链接时导出的全局变量会发生什么变化?

时间:2011-06-29 12:16:37

标签: c++ c windows dll

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

extern __declspec(dllexport) int foobar;

然后在实现文件中的foobar内定义此X.DLL全局变量:

int foobar = 1;

现在假设我有两个DLL,A.DLLB.DLL,它们与X.DLL相关联,而应用E.EXE则使用A.DLL和{ {1}}:

B.DLL

在这种情况下,在 +----> A.DLL ----+ | | E.EXE ----+ +----> X.DLL | | +----> B.DLL ----+ &foobar内进行评估时,表达式foobarA.DLL的地址)是否保证具有相同的值?换句话说,B.DLL的全局变量是存储两次还是在整个过程中只有X.DLL的一个实例?另外,如果DLL在加载时或通过调用LoadLibrary进行链接会有所不同吗?

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

  

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

考虑到上述情况,我不太明白该陈述的含义。

1 个答案:

答案 0 :(得分:2)

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