未定义的类构造函数引用,包括.cpp文件修复

时间:2013-03-22 20:18:03

标签: c++ debugging netbeans g++

我遇到的问题是,当我为我创建的类调用构造函数时,我收到以下错误。

  

main.cpp:20:未定义引用   `StaticObject :: StaticObject(Graphics *,sf :: String,
  SF :: Vector2)'

这个问题可以“修复”,在main.cpp中为.cpp文件添加一个include,就像这样。

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

虽然这解决了这个问题,但这似乎是一个糟糕的解决方案,并且违背了我之前所说的。有没有其他方法可以解决这个问题?我正在使用带有g ++的Netbeans 7.3来编写/编译这个程序。以下是相关代码。

的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. 为什么通过包含.hpp来隐含地包含.cpp 文件?

  3. 有更好的方法吗?

6 个答案:

答案 0 :(得分:18)

undefined reference错误表示链接器未找到函数/方法的定义(即此处的构造函数)。

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

添加以下行的原因是:

#include "GameObject/StaticObject.cpp"

解决了这个问题,它是否将实现作为main.cpp的一部分引入,而您的实际实现是StaticObject.cpp。这是解决此问题的 错误方式

我没有多少使用过Netbeans,但是应该有一个选项可以将所有.cpp文件添加到一个项目中,这样Netbeans就可以将所有.o文件链接到一个可执行文件中。< / p>

如果将StaticObject.cpp内置到自己的库中(我非常怀疑这是这种情况),那么您可能必须指定此库位置的路径,以便链接器可以找到实施

这是构建程序时理想情况:

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

虽然gcc / g ++中有一些方法可以跳过所有中间.o文件生成并直接生成main_program,但是如果在同一命令行中指定所有源文件(和任何库)。

答案 1 :(得分:6)

链接器找不到StaticObject的定义,这意味着您没有编译和链接StaticObject.cpp。每个.cpp文件都需要单独编译,编译器为每个文件生成的目标文件需要提供给链接器。

Main.cpp中包含StaticObject.cpp的原因是您告诉预处理器将StaticObject.cpp的内容插入到您正在编译的Main.cpp中,因此这些定义成为Main.cpp编译输出的一部分

答案 2 :(得分:3)

包括cpp文件导致编译器将该代码构建为该文件的一部分(您不应该这样做),您需要做的是将GameObject / StaticObject.cpp文件编译为自己的对象,并链接2对象在一起。

答案 3 :(得分:2)

我不太了解netbeans,但可能GameObject / StaticObject.cpp不包含在要编译的源代码中。

这就是为什么如果你在main.cpp手动包含它,他找到了源​​代码并且一切正常。

答案 4 :(得分:0)

我有同样的问题,但我的是因为我正在使用Eclipse CDT和 Autotools项目。因此,我必须手动将新的.h.cpp文件添加到相应的Makefile.am,然后执行项目&gt;重新配置项目,重建,就是这样。

答案 5 :(得分:0)

我在 Qt 中遇到了同样的问题,我忘记将类添加到 pro 文件中。显然,如果不将它添加到 pro 文件中,编译器就无法识别它。所以我把它加进去,然后再次运行 qmake,问题就解决了。

基本上,您需要在源中添加文件。