我使用 OpenGL 用 C++ 编写了一个简单的程序。我需要的是在两个文件中包含几个全局变量 - main.cpp 和 funcs.cpp - 它们将保持相同的值。当我试图在 funcs.h 中声明这些变量时(它也包含在 main.cpp 中)我得到了这个错误:
1>main.obj : error LNK2005: "int myVariable" (?myVariable@@3HA) already defined in funcs.obj
1>Path to my program : fatal error LNK1169: one or more multiply defined symbols found
这很明显,因为它会在 funcs.cpp 和 main.cpp 中创建变量。当我尝试以这种方式声明变量时:
//funcs.cpp
int myVariable;
//main.cpp
int myVariable;
而且它们都是全局的,我得到的错误与上面完全相同。让我感兴趣的是,两个变量在对面的文件中都不可见,那么为什么同名变量是错误的呢?据我所知,不可能从 main.cpp 和反向引用 funcs.cpp 中的 myVariable
。我的第二个问题是 - 解决我的问题的最佳方法是什么,因为我所做的只是重命名其中一些变量(其中有很多)并在 funcs.cpp 中添加函数,如 setNewValue(int newValue)
我可以从 main.cpp 调用它,但老实说 - 我并不为此感到自豪。
我使用 Microsoft Visual Studio 2012、C++/OpenGL。
最佳答案
使用 C++:
如果您试图在两个文件之间共享全局变量,则在其中一个文件中声明它,例如main.c,就像您现在所做的那样,并在另一个文件中将变量声明为
extern
。这样,该变量已在一个文件中声明,同一个变量可以在其他文件中使用,并且您不会遇到该变量的多个定义问题。如果您想在每个文件中使用同名的全局变量,这样文件不共享该变量,则使用匿名命名空间 限制变量的可见性:
namespace { int myVariable; // ...
标准 C:为了完整起见,如果您使用标准 C,而不是使用 namespace 来限制变量的可见性,您可以使用 static
关键字:如上,如果你想在每个文件中使用同名的全局变量,并且你不希望文件共享那个变量,那么您需要将它们声明为 static
。这限制了他们对当前文件的可见性。
使用 extern
共享全局在 C 中的工作方式类似。
关于c++ - 全局变量和链接器错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12901075/