2011-09-20 37 views
2

我写了一些东西来模拟Windows应用程序的getopt.h库,其中的一部分是全局变量。当我将程序编译为单个应用程序时,此工作正常;然而,当我分离getopt库并链接它时,我的程序开始出现段错误。研究这一点,似乎从DLL外部访问变量不起作用并返回无效指针;有什么我可以解决这个问题吗?跨DLL的C++全局变量

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

+0

是否可以从DLL内部和外部打印出变量的地址。这是要找出你是否有一个或两个变量的副本。 – Mysticial

+0

另外,变量是如何设置的?它是一个函数返回一个指针,一个外部暴露的指针,只是一个变量......? – ssube

+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内部和外部打印出地址。

+0

DLL导入/导出将无助于从DLL获取无效指针。它们控制外部可见的符号,它们实际上并不改变变量本身。 – ssube

+0

@peachykeen:你怎么知道问题不在于有不同的副本,因为它没有正确设置?指针正在DLL中正确写入,但客户端应用程序(无意)读取它自己的(无效)副本,因为它们没有合并(当它们应该是)。 – Mysticial

+0

这是可能的,这取决于变量类型以及事情的设置方式。我会删除我的投票,但我认为一些OP澄清会有所帮助。 *编辑:*似乎我不能删除,除非你编辑答案。 – ssube

3

考虑增加一个功能,您的DLL,它返回变量的值。