全局变量和链接器错误
Global variables and linker error
我用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和reverse引用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,而不是使用名称空间来限制变量的可见性,则可以使用static
关键字:如上所述,如果您希望在每个文件中使用具有相同名称的全局变量,并且您不希望文件共享该变量,则需要将它们声明为static
。这限制了它们在当前文件中的可见性。
使用extern
共享全局在C.中的作用类似
默认情况下,全局范围内的变量可用于所有其他翻译单元;其他翻译单元只需要使用CCD_ 7来访问该全局变量。因此,通常,为了使全局变量对每个单元都可见,您将extern
声明放在头文件中,而变量声明本身正好放在一个.c
/.cpp
文件中。
如果您想使一个变量只能在该文件中访问,请在全局范围内声明它为static
:
static int myVariable;
这是不合法的,因为假设的第三个文件可以使用extern
声明访问myVariable
。此时,编译器将不知道extern
声明引用的是funcs.cpp中的变量,还是main.cpp.中的变量
- Netbeans 10:错误:链接器命令失败,退出代码为 1(使用 -v 查看调用)
- CMake 错误:链接器命令失败,退出代码为 1 和 cpp.o 文件
- clang:错误:链接器命令失败,退出代码为 1(使用 -v 查看调用) - 体系结构的未定义符号 x86_64:
- 如何修复 clang: 错误:链接器命令失败,退出代码为 1(使用 -v 查看调用)
- Android NDK.Build命令失败.未定义的引用.clang++:错误:链接器命令失败,退出代码为1
- 使用cmake错误链接boost日志
- 错误:链接器命令失败,退出代码为 1(使用 -v 查看调用):在 Macbook 上
- C++ XCODE ld:找不到体系结构x86_64 clang 的符号:错误:链接器命令失败,退出代码为 1(使用 -
- clang:错误:链接器命令失败,C++代码中的退出代码为 1(使用 -v 查看调用)
- 静态库中的 g++ 错误链接函数
- 未定义的参考错误链接天然函数Android
- C++编译错误:ld:找不到体系结构x86_64 clang 的符号:错误:链接器命令失败,退出代码为 1(使用 -v
- QT Q_PROPERTY错误:链接器命令失败,退出代码为 1(使用 -v 查看调用)
- ld:找不到体系结构x86_64 clang 的符号:错误:链接器命令失败,退出代码为 1(使用 -v 查看调用)
- OSX MOJAVE -LD:架构X86_64 clang找不到符号:错误:链接器命令失败,出口代码1
- C 错误链接器命令失败了出口代码1(使用-V查看调用)
- LD:架构x86_64 clang找不到符号:错误:链接器命令失败,出口代码1(使用-v to See
- 聚输出错误 - 链接列表
- Xcode链接器错误:链接器命令失败,退出代码为1(使用-v查看调用)
- 尝试构建C DLIB示例无法与数百个未定义的参考错误链接