我在公共头文件中有一个全局变量。例如
commonHeader.h
int commonInt = 0;
我有3个dll项目,其中我想使用它,所以我包含上面的标题,但它给了我多次定义的错误符号,#pragma曾经也没有用。
如果我将上面的变量设为extern,并在我的exe中定义它,我的dll中会出现链接器错误。
我的所有dll都需要在标题之上。 我的一个dll需要其他2个dll的头文件(可能包含syombol的多个)
我如何解决上述问题,我只希望在dll和exe上有一个变量。
我在Windows 7上使用VS 2010教授。
提前谢谢。答案 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。