跨DLL的C ++全局变量

时间:2011-09-20 00:20:29

标签: c++ windows

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

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

2 个答案:

答案 0 :(得分:4)

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

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

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

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

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

编辑:

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

答案 1 :(得分:3)

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