我是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.h
与g++ main.cpp something.cpp
有任何关系。
thing
:g++ -c main.cpp something.cpp
有“多个定义”,即使我只明确定义了一次。
g++ *.o
:没有错误!但是,当我尝试运行thing
时,它给出了与上面相同的错误,所以我认为这是一个链接器错误。
任何人都可以解释如何编译多文件项目,以及为什么我的方法不起作用?我现在很困惑,因为上面是Stack Overflow上大多数C ++示例的样子。
图片的标题说明:
我 尝试了here的建议,但他们没有专门解决与标题的链接问题。
我不想在main
中重新定义Something thing
;如果我想这样做,我会输入{{1}}。
答案 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文件添加到项目中。