0

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

commonHeader.h

int commonInt = 0;

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

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

我所有的 dll 都需要上面的标题。我的一个 dll 需要其他 2 个 dll 的头文件(可能会包含多个符号)

我如何解决上述问题,我只想要一个跨 dll 和 exe 的变量。

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

提前致谢。

4

2 回答 2

3

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

在您的标题中,您应该有:

// commonHeader.h

extern int commonInt;    // global *declaration*

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

// some_file.cpp

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

当然,应尽可能避免使用全局变量——过度使用全局变量是一种“代码味道”,但有时无法避免。

于 2013-01-07T13:46:40.093 回答
3

通过在头文件中定义全局变量,您违反了单一定义规则(第 3.2 节)。相反,您只在头文件中声明它extern然后在单个实现文件中定义它是正确的。

但是为了让这个工作与 dll 一起工作,您还必须将其声明为由 exe 导出并由 dll 使用 和 导入__declspec(dllexport)__declspec(dllimport)使用适当的宏来__declspec根据您是编译 exe 还是 dll 来选择正确的。

于 2013-01-07T13:48:08.820 回答