LNK1169 and LNK2005 Errors

LNK1169 and LNK2005 Errors

本文关键字:Errors LNK2005 and LNK1169      更新时间:2023-10-16

在我的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没有改变这些行为。

这些结构在以前的c++版本中表现相同。