GCC中未定义的引用/多个定义错误
Undefined reference / multiple definition errors with GCC
我是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.cpp
与something.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文件添加到项目中。
- 使用命名空间时出现多个定义错误
- 对C宏的未定义引用,但在定义它时会出现重新定义错误
- 尝试调用 .h 文件中定义的变量时出现变量未定义错误
- 在头文件和 cpp 文件中使用一次 #pragma 时出现结构重定义错误
- 链接阶段出现多重定义错误
- 避免模板类中的重定义错误
- 即使我没有包含多个文件,C++中的多个定义错误
- 跨多个类的全局变量而不会出现重定义错误?
- 尝试运行 wasm 函数时出现模块未定义错误
- C++ 预期的左大括号以及重定义错误
- C++:成员的越界声明必须是纯虚函数的定义错误
- c++中数组的未定义错误
- Visual C:模板类中的自定义错误消息
- 为什么C++模板不会导致多个定义错误?
- 只有一个定义/声明时标头声明变量的多堆定义错误
- C++ 在多个其他类中使用单个类 - 编译时出现多个定义错误
- 基类未定义.错误 C2504
- Q 斯坦达项重定义错误
- 可视化C++中的结构定义错误
- VC++ C2011 重定义错误 - 未使用的头文件