Isaac Woods
Isaac Woods

Reputation: 1163

C++ strange "undefined reference"

I'm relatively new to c++, so bear with a little.

I have a class with the constructor:

Window(int width, int height, const std::string& title);

As defined in the header file.

I then have the code:

#include "window.h"

int main(int argc, char** argv) {
    new Window(800, 600, "Elysian Engine");
}

in Main.

When building, I am getting the error "undefined reference to 'Window(int, int, std::string const&)'" Which I do not understand, as I thought I am correctly importing it and everything. I understand this to be a linking error, but I'm not sure why.

Thanks!

--- EDIT ---

The code for window.cpp:

#include "window.h"
#include <SDL2/SDL.h>
#include <SDL/SDL.h>
#include <GL/glew.h>

Window::Window(int width, int height, const std::string& title) :
        width(width),
        height(height),
        title(title),
        isCloseRequested(false) {
    SDL_Init(SDL_INIT_EVERYTHING);

    SDL_GL_SetAttribute(SDL_GL_RED_SIZE,                8);
    SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE,              8);
    SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE,               8);
    SDL_GL_SetAttribute(SDL_GL_ALPHA_SIZE,              8);
    SDL_GL_SetAttribute(SDL_GL_BUFFER_SIZE,             32);
    SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE,              16);
    SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER,            1);

    SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK,    SDL_GL_CONTEXT_PROFILE_CORE);
    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION,   3);
    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION,   2);

    window = SDL_CreateWindow(title.c_str(), SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, width, height, SDL_WINDOW_OPENGL);
    context = SDL_GL_CreateContext(window);

    SDL_GL_SetSwapInterval(1);

    GLenum res = glewInit();

    if (res != GLEW_OK) {
        fprintf(stderr, "Error: '%s'\n", glewGetErrorString(res));
    }
}

Window::~Window() {
    SDL_GL_DeleteContext(context);
    SDL_DestroyWindow(window);
    SDL_Quit();
}

Upvotes: 0

Views: 943

Answers (1)

buratino
buratino

Reputation: 1518

Because your code does not appear to be causing the issue, I will address the IDE.

When I first started using Code::Blocks, I ran into the "undefined reference" problem quite a bit. There are multiple ways that I solved this.

  • Exit Code::Blocks and re-open it. This solved my issues more times than I would care to count. It's similar to finally realizing that an executable is acting strangely because you needed to run make clean before compiling; sometimes, you are compiling an old version of code without realizing it.

  • Delete window.h and window.cpp from the project and re-add them. This is similar to the solution above. Although this has worked for me before, I couldn't figure out exactly why it worked.

  • Include the full path of window.h. Instead of #include "window.h", try #include "/path/goes/here/window.h". It is possible that your current location (as specified in your #include statement) is incorrect.

  • Check the compiler that is selected for the project. When I used Code::Blocks, I typically used gcc. However, there was a case where I was receiving all sorts of errors (upon attempting compilation) that I either did not understand or could not resolve, only to learn that I had accidentally selected some gcc variant from the compiler selection list that I did not even have installed.

  • Create a new project. Move your source files out of the project folder that is created by Code::Blocks, and then remove that project folder. Launch Code::Blocks, create a new project, and add your source files to the new project.

  • When all else fails and you absolutely must use Code::Blocks, reinstall the full package. I had to do this my first time using Code::Blocks (which was also my first time using an IDE). I realized that I had a bare-bones installation of the IDE, which was limiting what I could do (including compiling). Naturally, I cannot access the Code::Blocks website right now, otherwise I would offer a link here as well. In this case, I think it is safe to say that the full-featured stable version will be the largest (in MB) you can find on Code::Blocks' Downloads page. After you have reinstalled, create a new project and add your files back to it.

I eventually moved to using writing code in an IDE (for the linting!), and taking care of a makefile on my own. It has been awhile since I've used Code::Blocks, but each of the above bullets represents solutions/work-arounds that have helped me for your specific problem (or, in general) while I was using Code::Blocks.

Upvotes: 1

Related Questions