Undefined reference to class constructor, includin

2019-03-11 03:59发布

The problem I am having is that, when I call a constructor for a class I have created I get the following error.

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

This problem can be 'fixed' adding an include for the .cpp file in main.cpp like so.

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

Although this solves the problem, this seems like a poor solution and goes against what I have been previously told. Is there any other way to solve this problem? I'm using Netbeans 7.3 with g++ to code/compile this program. Below is the relevant code.

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() {
}

If I add the following line to main.cpp, the error disappears.

#include "GameObject/StaticObject.cpp"

Can anyone please explain:

  1. Why this fixes the problem?

  2. Why the .cpp was not implicitly included through including the .hpp file?

  3. Is there a better way of doing this?

5条回答
\"骚年 ilove
2楼-- · 2019-03-11 04:11

The linker cannot find the definition for StaticObject, which means you have not compiled and linked StaticObject.cpp. Each .cpp file needs to be separately compiled, and the object files the compiler produces for each one needs to be given to the linker.

The reason including StaticObject.cpp in Main.cpp works is that you are telling the preprocessor to insert the contents of StaticObject.cpp into Main.cpp, which you are compiling, so the definitions become part of Main.cpp's compiled output.

查看更多
做个烂人
3楼-- · 2019-03-11 04:13

I dont know much of netbeans, but probably GameObject/StaticObject.cpp is not included as part of the sources to compile.

That's why if you include it manually at main.cpp he found source code and everything is ok.

查看更多
Bombasti
4楼-- · 2019-03-11 04:21

including the cpp file causes the compiler to build that code as part of that file (which you should not do), what you need to do is compile the GameObject/StaticObject.cpp file as its own object, and link the 2 objects together.

查看更多
相关推荐>>
5楼-- · 2019-03-11 04:22

The undefined reference error indicates that the definition of a function/method (i.e constructor here) was not found by the linker.

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

And the reason that adding the following line:

#include "GameObject/StaticObject.cpp"

fixes the issue, is it brings in the implementation as part of the main.cpp whereas your actual implementation is in StaticObject.cpp. This is an incorrect way to fix this problem.

I haven't used Netbeans much, but there should be an option to add all the .cpp files into a single project, so that Netbeans takes care of linking all the .o files into a single executable.

If StaticObject.cpp is built into a library of its own (I highly doubt that is the case here), then you might have to specify the path to the location of this library, so that the linker can find the implementation.

This is what ideally happens when you build your program:

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

Although there are ways in gcc/g++ to skip all the intermediate .o file generations and directly generate the main_program, if you specify all the source files (and any libraries) in the same command line.

查看更多
贪生不怕死
6楼-- · 2019-03-11 04:29

I had the same issue but mine was because I'm using Eclipse CDT with and Autotools project. So I had to manually add the new .h and .cpp files to the corresponding Makefile.am, and then do a project > reconfigure project, rebuild, an that was it.

查看更多
登录 后发表回答