未定义参考类的构造函数,包括.cpp文件修复(Undefined reference to clas

2019-08-17 21:38发布

我遇到的问题是,当我调用构造函数为我创建了一个类,我得到了下面的错误。

main.cpp中:20:未定义的引用`StaticObject :: StaticObject(图形*,SF ::字符串,
SF :: Vector2)”

这个问题可以“固定”加入包括用于像这样在main.cpp中.cpp文件。

...
#include "GameObjects/StaticObject.cpp"
...

虽然这解决了这个问题,这似乎是一个贫穷的解决方案,违背了我先前已经告诉。 是否有任何其他的方式来解决这个问题呢? 我使用NetBeans 7.3 G ++代码/编译这个程序。 下面是相关的代码。

main.cpp中

...

#include <SFML/Graphics.hpp>
#include "Graphics/Graphics.hpp"
#include "GameObjects/StaticObject.hpp"

int main(int argc, char** argv) {

    //SETUP
    Graphics graphics;

    background = new StaticObject(&graphics, "Data/Images/BackgroundPlaceholder.png",  sf::Vector2f(0,0));

...

main.hpp

...

#include <SFML/Graphics.hpp>
#include "GameObjects/StaticObject.hpp"

...

// Objects
StaticObject *background;
...

StaticObject.hpp

#include <SFML/Graphics.hpp>
#include "../Graphics/Graphics.hpp"

class StaticObject{
public:
    StaticObject();
    StaticObject(Graphics *_graphics, sf::String texture_filename, sf::Vector2f _position);
    StaticObject(const StaticObject& orig);
    virtual ~StaticObject();
private:
    // The sprite stores the position
    sf::Sprite *sprite;
    sf::Texture *texture;
};

StaticObject.cpp

#include "StaticObject.hpp"
#include <SFML/Graphics.hpp>
#include "../Graphics/Graphics.hpp"

StaticObject::StaticObject(){    
}

StaticObject::StaticObject(Graphics *_graphics, sf::String texture_filename, sf::Vector2f _position) {
    sprite = _graphics->AddSprite(texture_filename);
    sprite->setPosition(_position);
}

StaticObject::StaticObject(const StaticObject& orig) {
}

StaticObject::~StaticObject() {
}

如果我下面的行添加到main.cpp中,错误消失。

#include "GameObject/StaticObject.cpp"

任何人都可以请解释:

  1. 为什么这能解决问题?

  2. 为什么在.cpp不是隐含通过包括.HPP文件包括在内?

  3. 是否有这样做的更好的办法?

Answer 1:

undefined reference错误指示的功能/方法(即此处的构造)的定义不是由接头找到。

StaticObject::StaticObject(Graphics*, sf::String,    sf::Vector2<float>)

其原因,添加以下行:

#include "GameObject/StaticObject.cpp"

解决这个问题,它是在实施带来的部分main.cpp ,而你的实际执行是StaticObject.cpp 。 这是解决这个问题的不正确的方法

我没有用过Netbeans的多,但应该有所有的.cpp文件添加到一个单一的项目,让Netbeans的照顾所有链接的选项.o文件合并为一个可执行文件。

如果StaticObject.cpp内置到它自己的库(我很怀疑这是这里的情况),那么你可能必须指定的路径,该库的位置,以便链接可以找到执行。

这是当你建立你的计划是什么理想情况:

Compile: StaticObject.cpp -> StaticObject.o
Compile: main.cpp -> main.o
Link: StaticObject.o, main.o -> main_program

虽然在GCC方式/克++跳过所有中间的.o文件代,直接生成main_program ,如果指定在同一命令行中的所有源文件(和任何库)。



Answer 2:

链接器找不到定义StaticObject ,这意味着你没有编译和链接StaticObject.cpp。 每个cpp文件需要被单独编译,并且对象文件,编译器产生用于每一个需要被提供给链接器。

其原因包括StaticObject.cpp在Main.cpp的工作原理是,你告诉预处理器StaticObject.cpp的内容插入Main.cpp的,你所编写的,所以定义成为Main.cpp的的编译输出的一部分。



Answer 3:

包括cpp文件导致构建代码为文件(你不应该这样做)的一部分,编译器,你需要做的是编译的游戏对象/ StaticObject.cpp文件作为自己的对象,以及两个对象链接在一起。



Answer 4:

我不知道多大的NetBeans,但可能不包括游戏对象/ StaticObject.cpp的来源一部分进行编译。

这就是为什么如果您手动包括它在main.cpp中,他发现源代码,一切正常。



Answer 5:

我有同样的问题,但我的是因为我使用的Eclipse CDT与和自动工具项目 。 所以我不得不手动将新添加.h.cpp文件到相应的Makefile.am ,然后做一个项目>重新配置项目 ,重建,一个仅此而已。



文章来源: Undefined reference to class constructor, including .cpp file fixes