c++ - 对类构造函数的 undefined reference ,包括 .cpp 文件修复

标签 c++ debugging netbeans g++

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

main.cpp:20: undefined reference to `StaticObject::StaticObject(Graphics*, sf::String,
sf::Vector2)'

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

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

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

ma​​in.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));

...

ma​​in.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. 有更好的方法吗?

最佳答案

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/g++ 中有一些方法可以跳过所有中间 .o 文件生成并直接生成 main_program,但如果您在同一命令行中指定所有源文件(和任何库) .

关于c++ - 对类构造函数的 undefined reference ,包括 .cpp 文件修复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15579172/

相关文章:

c++ - 功能 'not declared in this scope' ,但它是!不是吗?

c++ - 访问匿名命名空间内的变量 (c++)

ruby - 如何在 ruby​​ 中启用特定的调试输出?

java - 编译器不喜欢重写

java - 适用于 OS X Lion 的 Netbeans 中的 JDK 7

c++ - 切片与向上转换::我的理解正确吗?

c# - F5 或开始调试按钮对于 Winform 应用程序是灰色的吗?

java - 无缘无故的错误

java - InputStream - 关闭、中断阻塞 read()

c++ - 简单 Python 客户端和 C++ 服务器的示例