LNK1169 and LNK2005 Errors
LNK1169 and LNK2005 Errors
在我的c++项目中,当我在头文件中声明全局变量时,我在visual studio 2012中得到LNK2005(x已经在y.obj中定义)和LNK1169(一个或多个多重定义的符号发现z.exe)错误,但是当我用const标识符声明全局变量时,我没有得到错误。从我在msdn的研究中,我了解到这是因为项目属性。但是我不能用属性来修复它们。它仅用const标识符固定。但是我在c++中找不到任何关于它的规则。这是c++ 11的新特性吗?
这是一个声明全局变量:
extern int my_global;
全局变量的定义:
int my_global;
全局变量的声明表示"这是一个对象的名称"。定义表示"这是一个对象的名称,请为它分配存储空间"。
一个全局变量可以有任意多个声明(这样任何源文件中的任何人都可以引用同一个对象),但是你只能有一个定义,因为当程序运行时,该对象只能存在于内存中的一个位置。
链接器抱怨你对同一个对象有多个定义,因为你在头文件中放了一个定义,而这个头文件被包含在多个源文件中。所以当那些源文件被编译时,你会得到多个定义,而链接器不能那样做。
解决方案是在头文件中只放置一个声明,然后在中只放置一个源文件中的定义。例如:// MyVariables.h
extern int my_global;
// MyVariables.cpp
int my_global = 42;
您在const
关键字上看到不同行为的原因是因为const
给了全局变量内部链接,这意味着它们对其他源文件不可见。实际上,这意味着包含头文件的每个源文件都有自己的常量副本。这将占用更多的内存,但它不会被注意到。由于它是一个常量,没有人会注意到不同的常量指向内存中的不同位置。
c++ 11没有改变这些行为。
相关文章:
- 使用 GCC 卸载的 OpenMP 卸载失败,并出现"Ptx assembly aborted due to errors"
- 运行 C++ 单元测试时LNK2005链接错误
- 无法使函数公开。获取:"LNK2005"错误。如何调试链接器错误
- 如果两个静态库使用相同的另一个静态库,如何避免"LNK2005 Already Defined error"?
- 错误LNK2005无法解决问题的解决方案
- 在UE4(虚幻引擎4)中集成LuaJit时LNK2005错误
- 从模板继承的 MSVC DLL 导出类会导致LNK2005已定义的错误
- C++错误LNK2005和不同项目文件的常规继承
- LNK2005 中已经定义的函数
- LNK2005 AND LNK1169 Errors - C++
- C++ errors - C4819, C2761, C2447
- 我需要帮助C LNK2005和LNK1169中的类代码分开
- 使用 AMD 的 Vulkan 内存分配器时出现链接器错误 (LNK2005)
- 我在用c ++编程时一直遇到LNK2005错误,我似乎无法弄清楚问题是什么
- Visual Studio Build Errors not in UI
- Error LNK2005 and LNK1169
- LNK2005 of death (c++)
- 是什么导致了代码中出现"error LNK2005: already defined in .obj"错误?
- LNK1169 and LNK2005 Errors
- VC8 to VC10 - LNK2005 errors