GCC未定义的参考/多重定义错误

时间:2015-07-23 00:23:05

标签: c++ gcc g++ header-files

我是C ++的新手。我在使用class Something { public: void do_something() const; } thing; 构建一个简单的多文件项目时遇到了麻烦。这是我的文件:

something.h

#include <iostream>
#include "something.h"

void Something::do_something() const
{
    std::cout << "Hello!" << std::endl;
}

something.cpp

#include "something.h"

int main()
{
    thing.do_something();
}

的main.cpp

g++ main.cpp

以下是我的尝试:

  • do_something给出错误something.cpp是未定义的引用,这是有道理的,因为编译器不知道something.hg++ main.cpp something.cpp有任何关系。

  • thingg++ -c main.cpp something.cpp有“多个定义”,即使我只明确定义了一次。

  • g++ *.o:没有错误!但是,当我尝试运行thing时,它给出了与上面相同的错误,所以我认为这是一个链接器错误。

任何人都可以解释如何编译多文件项目,以及为什么我的方法不起作用?我现在很困惑,因为上面是Stack Overflow上大多数C ++示例的样子。

图片的标题说明:

  • 尝试了here的建议,但他们没有专门解决与标题的链接问题。

  • 我不想在main中重新定义Something thing;如果我想这样做,我会输入{{1}}。

2 个答案:

答案 0 :(得分:3)

  

g++ main.cpp给出错误do_something是未定义的引用,这是有道理的,因为编译器不知道something.cpp [...]

...包含成员函数do_something的定义。所以你引用了一个未定义的函数。

  

g++ -c main.cpp something.cpp:没有错误! [...]

...因为您只是编译文件,而不是将它们链接在一起。

当你将它们链接在一起时,最终会得到

  

[{1}} [...]

的'多个定义'

这正是你正在做的事情:

thing

相同
class Something {
  // content
} thing;

由于class Something { // content }; Something thing; 通过有效地将包含文件的内容直接复制到包含文件中来工作,因此最终得到2个带有行的文件

#include "something.h"

在他们每个人中。这就是链接器(从编译器前端调用)告诉你的:全局变量Something thing; 有多个定义。

要解决此问题:不要将全局变量的定义放入头文件中,只能声明:

thing

然后在单个源文件中添加定义:

extern Something thing;

或者,更好的是,尽量避免全局变量。

还有一件事:如果你还没有这样做,请使用包含防护装置作为标题。

答案 1 :(得分:0)

确保已将所有文件添加到项目中。 就像使用IDE,例如DEV C ++一样,您必须将每个.cpp或.h文件添加到项目中。