为什么链接器在头文件中为全局变量提供错误

时间:2014-10-11 04:49:39

标签: c++ linker extern

我在header.h中声明了一个全局变量,并在source.cpp和main.cpp中包含了该头,但是链接器给出了错误

Source.obj : error LNK2005: "int globalVariable" (?globalVariable@@3HA) already defined in     Main.obj
GlobalVariableAndLinkageIssue.exe fatal error LNK1169: one or more multiply defined symbols found

header.h

int globalVariable;

source.cpp

#include "header.h"

的main.cpp

#include"header.h"

void main() {}

5 个答案:

答案 0 :(得分:3)

  1. 将声明移动到.cpp文件。您可以使用以下命令在头文件中使用声明:

    extern int globalVariable; // declaration in header - can have as many as you need

    但是.cpp文件应该有定义:

    int globalVariable; // definition in .cpp - only need one across all your files

    C和C ++使用文本预处理器来包含标题,这基本上是文本插入,而不是某些语言中的智能模块系统。通过按原样包含它,您将创建多个定义,每个.cpp文件一个。

  2. 作为一种良好实践,您需要习惯使用包含保护来防止多个嵌套包含(尽管它不能解决您当前的问题)。如果使用Visual C ++,您可以使用#pragma once或使用便携式解决方案将标题代码包装在:

    #ifndef _INCLUDE_FOO_H_

    #endif

答案 1 :(得分:1)

要创建全局变量,您应该执行以下操作。请注意,在标题中,我们将变量标记为extern,我们实际上在cpp文件中创建了对象。

header.h

extern int globalVariable;

header.cpp

#include "header.h"
int globalVariable;

的main.cpp

#include "header.h"

int main() {}

答案 2 :(得分:0)

因为两个来源#include你的标题,因此它被定义了两次。

答案 3 :(得分:0)

将全局变量放在某个.c或.cpp文件中,这样它只能定义一次并使用extern在头文件中引用 例如,

<强> header.h

extern int globalVariable;

<强> header.cpp

int globalVariable = 0;

<强> source.cpp

#include "header.h"

<强>的main.cpp

#include"header.h"

int main() {
  return 0;
}

答案 4 :(得分:-2)

在这种情况下,通常使用一些#define如下:

//header.h
#ifdef DEFINE_VARS
   #define DEFINE_OR_DECLARE 
#else
   #define DEFINE_OR_DECLARE extern
#endif

DEFINE_OR_DECLARE int globalVariable;


//main.cpp
#define DEFINE_VARS
#include "header.h"
...

//header.cpp
#include "header.h"
...