Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.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++ C++;DLL中的全局变量_C++_Windows - Fatal编程技术网

C++ C++;DLL中的全局变量

C++ C++;DLL中的全局变量,c++,windows,C++,Windows,我写了一些东西来模拟Windows应用程序的getopt.h库,其中一部分是全局变量。当我将程序编译为一个应用程序时,它工作得很好;然而,当我分离getopt库并与之链接时,我的程序开始出现错误。调查这一点,似乎从DLL外部访问变量不起作用,并返回无效指针;我能做些什么来解决这个问题吗 编辑:如果我在调试器的DLL中输入一个函数,则变量具有正确的值-直接从应用程序访问该变量会给出不同的值。可能发生的情况是您没有正确设置dllexport/dllimport。结果是,您将得到同一变量的不同副本。(

我写了一些东西来模拟Windows应用程序的getopt.h库,其中一部分是全局变量。当我将程序编译为一个应用程序时,它工作得很好;然而,当我分离getopt库并与之链接时,我的程序开始出现错误。调查这一点,似乎从DLL外部访问变量不起作用,并返回无效指针;我能做些什么来解决这个问题吗


编辑:如果我在调试器的DLL中输入一个函数,则变量具有正确的值-直接从应用程序访问该变量会给出不同的值。

可能发生的情况是您没有正确设置
dllexport/dllimport
。结果是,您将得到同一变量的不同副本。(一个在DLL中,一个在外部)

在DLL中,您需要使用
dllexport
进行编译,以将变量公开给客户端应用程序

然后在客户端应用程序中,需要声明与
dllimport
相同的变量。然后它将链接到DLL中的一个

这有点不幸,因为DLL和客户端通常使用相同的头。因此,通常的解决方法是:

#ifdef COMPILE_DLL
#define DLL_EXPORT  __declspec(dllexport)
#else
#define DLL_EXPORT  __declspec(dllimport)
#endif
编辑:


能否确认是否有同一变量的两个副本?尝试从DLL内部和外部打印地址。

考虑向DLL添加一个返回变量值的函数。

DLL导入/导出无助于从DLL获取无效指针。它们控制外部可见的符号,实际上并不改变变量本身。@peachykeen:你怎么知道问题不是因为设置不正确而存在不同的副本?指针正在DLL中正确写入,但客户端应用程序正在(无意中)读取它自己的(无效)副本,因为它们没有合并(当它们应该合并时)。这是可能的,具体取决于变量类型和设置方式。我将取消我的反对票,尽管我认为澄清一下OP会有所帮助。编辑:除非你编辑答案,否则我似乎无法删除。@peachykeen:我进行了编辑,并要求确认变量是否有一个或两个副本。你能从DLL内部和外部打印出变量的地址吗。这是为了确定您是否有一个或两个变量的副本。此外,变量是如何设置的?它是一个返回指针的函数,一个外部暴露的指针,只是一个变量…?它只是一个外部暴露的指针。