“多个定义”链接器错误

时间:2018-08-09 22:31:36

标签: c++ linker multiple-definition-error

我有四个要编译的C ++文件。两个是.h,两个是.cpp。我创建了一个生成文件,该文件生成两个对象,并使用g ++对其进行编译。在.h文件之一中定义了一个int,链接器坚持将其定义两次。我究竟做错了什么? 这些是源文件:

“ foo.cpp”

#include "foo.h"
#include "bar.h"
int main ()
{
    X();
}

“ foo.h”

#ifndef j
#define j
bool a;
#endif

“ bar.cpp”

#include "bar.h"
int X()
{
    b = 0;
    return b;
}

“ bar.h”

#ifndef k
#define k
int b;
int X();
#endif

“ Makefile”

exec: foo.o bar.o
g++ -oexec foo.o bar.o

foo.o: foo.cpp foo.h
bar.o: bar.cpp bar.h

这是我得到的编译错误:

/usr/bin/ld: bar.o:(.bss+0x0): multiple definition of `b'; foo.o:(.bss+0x4): first defined here
collect2: error: ld returned 1 exit status

P.S。不,这不是作业的一部分。我为这篇文章做了一个简化的例子。

1 个答案:

答案 0 :(得分:1)

您定义了变量

bool a;
int b;

在头文件中,这些头文件将其包含在多个源代码中,每个源代码都在结果对象文件中创建了一个定义。

您应该避免在头文件中声明变量(非静态类成员除外)。如果确实需要在头文件中传达这样一个变量的存在,请将其声明为extern

// foo.h
extern int b;      // declares the existence of a variable named b

// foo.cpp
#include foo.h
int b;             // keeps the promise made in foo.h

// bar.h
#include foo.h
b = 2;             // modifies the variable b in foo.cpp