Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 动态链接DLL需要与其调用者共享一个全局变量_C++_Global Variables_Dynamic Linking - Fatal编程技术网

C++ 动态链接DLL需要与其调用者共享一个全局变量

C++ 动态链接DLL需要与其调用者共享一个全局变量,c++,global-variables,dynamic-linking,C++,Global Variables,Dynamic Linking,我有一个静态库libStatic,它定义了这样一个全局变量 头文件libStatic/globals.h: extern int globvar; 代码文件libStatic/globals.cpp: int globvar = 42; DLL libDynamic和可执行运行程序正在使用此全局变量。此外,libDynamic在运行时链接到runner(通过LoadLibrary(),GetProcAddress(),以及works…) 我理解这将导致两次创建globvar,一次在runne

我有一个静态库libStatic,它定义了这样一个全局变量

头文件
libStatic/globals.h

extern int globvar;
代码文件libStatic/globals.cpp

int globvar = 42;
DLL libDynamic和可执行运行程序正在使用此全局变量。此外,
libDynamic
在运行时链接到runner(通过
LoadLibrary()
GetProcAddress()
,以及works…)

我理解这将导致两次创建
globvar
,一次在runner堆中,一次在libDynamic堆中,这当然是非常不可取的


这有什么好办法吗?如何确保libDynamic和runner使用相同的
globvar

一种简单的方法是让
.DLL
指向可执行文件的全局变量。加载之后,您将立即调用该库中的一个特殊函数(类似于
SetGlobVar(int*)
)。这样,库将始终指向与
.EXE

相同的全局变量。是否必须使用全局变量?也许你能想出一个更好的方法来绕过这种状态?这个例子被简化了很多,以避免问题过于复杂。实际上,它不仅仅是一个简单的int变量,而是一个复杂的单例对象。我正在寻找一种方法来确保单例在应用程序和动态库的组合范围内只存在一次。我担心我会得到这个答案。。。虽然它是100%正确的,但我不喜欢这种必要性,如果它存在的话,我更喜欢一种更优雅的方式。将全局变量移动到一个单独的模块(dll)中,该模块可以由两者动态链接(不是运行时链接!动态链接)。对全局变量使用。对于您的需求来说,这可能是一种过分的做法,但这就是基本的iostream库创建cout及其朋友的方式。