连接错误:全局变量的多个定义

时间:2011-11-20 16:51:54

标签: c gcc linker

我正在使用gcc编译许多.c文件。让我们说以下是这样的:

C文件是:

main.c 
tree.c

头文件是:

 tree.h

我在tree.h中声明了一些golbal变量。让我们说以下是指定值的全局变量:

 int fanout = 5;

之前我在main()文件中保留了 tree.c 个功能。链接没有问题。但现在我想保持主要功能分开。我刚刚在新创建的.c文件中移动了main函数。现在的问题是,它 显示链接错误:

 main.o error: fanout declared first time
 tree.o error: multiple declaration of fanout.

请让我知道如何摆脱这个问题。

提前致谢,

1 个答案:

答案 0 :(得分:3)

如果在多个源文件中包含声明和定义int fanout的头文件,则会破坏一个定义规则
根据ODR,在一个翻译单元中只能有一个变量定义(标题文件+源文件) 为了避免它,
您需要使用extern关键字。三个简单的步骤:

  • 声明extern变量

tree.h

extern int fanout;   
  • 定义变量

在其中一个c文件(tree.c)中定义变量。

#include "tree.h"   
extern int fanout = 5;
  • 使用变量

然后,您将tree.h包含在要访问fanout的任何源文件中。

main.c

#include "tree.h"
int main()
{
    fanout = 10;
    return 0;
}