在dll和exe中使用全局变量

时间:2013-01-07 13:44:27

标签: c++ dll

我在公共头文件中有一个全局变量。例如

commonHeader.h

int commonInt = 0;

我有3个dll项目,其中我想使用它,所以我包含上面的标题,但它给了我多次定义的错误符号,#pragma曾经也没有用。

如果我将上面的变量设为extern,并在我的exe中定义它,我的dll中会出现链接器错误。

我的所有dll都需要在标题之上。 我的一个dll需要其他2个dll的头文件(可能包含syombol的多个)

我如何解决上述问题,我只希望在dll和exe上有一个变量。

我在Windows 7上使用VS 2010教授。

提前谢谢。

2 个答案:

答案 0 :(得分:3)

您只应在标头中声明全局变量。它们应该在实现(源)文件中定义

在标题中,您应该:

// commonHeader.h

extern int commonInt;    // global *declaration*

然后在一个的实施文件中,你应该有:

// some_file.cpp

int commonInt = 0;       // global *definition* (and initialisation)

当然,在合理可能的情况下应该避免使用全局变量 - 过度使用全局变量是一种“代码气味”,但有时无法避免。

答案 1 :(得分:3)

通过在头文件中包含全局变量定义,您违反了One Definition Rule(第3.2节)。相反,您只能在带有extern的头文件中声明它,然后将定义放在单个实现文件中。

但是为了让这个与dll一起工作,你还必须将它声明为由exe导出并由dll导入__declspec(dllexport)__declspec(dllimport),使用适当的宏来选择正确的{{ 1}}取决于你是在编译exe还是dll。