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

C++ 对类构造函数的未定义引用,包括.cpp文件修复,c++,debugging,netbeans,g++,C++,Debugging,Netbeans,G++,我遇到的问题是,当我为我创建的类调用构造函数时,我得到以下错误 main.cpp:20:未定义对的引用 `StaticObject::StaticObject(图形*,sf::字符串, sf::矢量2)' 在main.cpp中添加.cpp文件的include可以“修复”此问题,如下所示 ... #include "GameObjects/StaticObject.cpp" ... 虽然这解决了问题,但这似乎是一个糟糕的解决方案,与我之前被告知的情况背道而驰。还有别的办法解决这个问题吗?我正在使

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

main.cpp:20:未定义对的引用 `StaticObject::StaticObject(图形*,sf::字符串,
sf::矢量2)'

在main.cpp中添加.cpp文件的include可以“修复”此问题,如下所示

...
#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));

...
...

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

...

// Objects
StaticObject *background;
...
#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;
};
#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() {
}
请任何人解释一下:

  • 为什么这能解决问题

  • 为什么.cpp不是通过包含.hpp隐式包含的 档案

  • 有更好的方法吗


  • 链接器找不到
    StaticObject
    的定义,这意味着您尚未编译并链接StaticObject.cpp。每个.cpp文件都需要单独编译,编译器为每个文件生成的对象文件需要提供给链接器

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

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

    未定义引用的
    错误指示函数/方法的定义链接器未找到(即此处的构造函数)

    StaticObject::StaticObject(Graphics*, sf::String,    sf::Vector2<float>)
    
    解决了这个问题,它将实现作为
    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_程序
    的方法,但如果您指定了所有源文件(以及任何库)在同一个命令行中。

    我不太了解netbeans,但可能GameObject/StaticObject.cpp没有作为编译源代码的一部分包含在内


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

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

    我也有同样的问题,但我的问题是因为我使用的是Eclipse CDT和Autotools项目。因此,我必须手动将新的
    .h
    .cpp
    文件添加到相应的
    Makefile.am
    ,并将其添加到当我做一个项目>重新配置项目,重建,就是这样。

    我在Qt中也遇到了同样的问题,我忘了将类添加到pro文件中。显然,没有添加到pro文件中,编译器无法识别它。所以我添加了它,然后再次运行qmake,这就解决了问题


    基本上,您需要将文件添加到源代码中。

    您的项目中是否包含GameObject/StaticObject.cpp?看起来不像是错误造成的“在项目中”是什么意思?如上所述,使用“包含”似乎可以解决问题,但必须有更好的方法。顺便说一句,谢谢:)不要包含cpp,编译它并链接到对象文件。包含cpp文件会导致编译器将该代码构建为该文件的一部分(您不应该这样做),您需要做的是将GameObject/StaticObject.cpp文件编译为自己的对象,并将这两个对象链接在一起。你在用什么来构建?@bizzehdee我刚刚检查了NetBeans项目树,尽管这个类是使用NetBeans和更早的版本创建的,但它似乎以某种方式删除了自己。重新添加相关文件后,问题消失了。非常感谢你!把你的答案贴出来,如果可能的话,我会把它标记为解决方案,以表示感谢谢谢!:)不知怎的,StaticObject文件已经从项目中删除了它们自己。重新添加并解决问题!
    Compile: StaticObject.cpp -> StaticObject.o
    Compile: main.cpp -> main.o
    Link: StaticObject.o, main.o -> main_program