GCC中未定义的引用/多个定义错误

Undefined reference / multiple definition errors with GCC

本文关键字:定义 错误 引用 未定义 GCC      更新时间:2023-10-16

我是c++的新手。我在用g++构建一个简单的多文件项目时遇到了麻烦。以下是我的文件:

something.h

class Something
{
public:
    void do_something() const;
} thing;

something.cpp

#include <iostream>
#include "something.h"
void Something::do_something() const
{
    std::cout << "Hello!" << std::endl;
}

main.cpp

#include "something.h"
int main()
{
    thing.do_something();
}

这是我尝试的:

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

  • g++ main.cpp something.cpp: thing有"多重定义",尽管我只明确定义了一次。

  • g++ -c main.cpp something.cpp: no error !然而,当我尝试运行g++ *.o时,它给了我与上面相同的错误,所以我认为这是一个链接器错误。

谁能解释一下如何编译一个多文件项目,为什么我的方法不工作?我现在很困惑,因为上面是Stack Overflow上大多数c++示例的样子。


旁注:

  • 确实尝试了这里的建议,但是他们没有特别解决头文件的链接问题。

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

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

…其中包含成员函数do_something存在的定义。所以你引用了一个未定义的函数。

g++ -c main.cpp something.cpp: no errors![…]

…因为你只是在编译这些文件,而不是把它们链接在一起。

当你把它们连在一起时,你就得到了

[…thing的"多重定义"[…]

这就是你正在做的:

class Something {
  // content
} thing;

相同
class Something {
 // content
};
Something thing;

由于#include "something.h"通过有效地将包含文件的内容复制到包含文件中来工作,因此您最终会得到2个带有一行

的文件
Something thing;

。这就是链接器(从编译器前端调用)告诉你的:全局变量thing有多个定义。

要解决这个问题:不要把全局变量的定义放在头文件中,只有声明:

extern Something thing;

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

Something thing;

或者,最好避免使用全局变量。


还有一件事:如果你还没有这样做,在你的标题中使用include保护符

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