0

I am currently trying to debug a program, which is rather determined to not run. I guess the mistake is rather simple, I am really new to c++ and using cmake.

Here is the error message:

Scanning dependencies of target viewer [ 25%] Building CXX object CMakeFiles/viewer.dir/Main.cpp.o [ 50%] Building CXX object CMakeFiles/viewer.dir/TriangleMesh.cpp.o [ 75%] Building CXX object CMakeFiles/viewer.dir/Camera.cpp.o [100%] Building CXX object CMakeFiles/viewer.dir/MainWindow.cpp.o Linking CXX executable viewer CMakeFiles/viewer.dir/MainWindow.cpp.o:MainWindow.cpp:function MainWindow::mousePressed(int, int, int, int): error: undefined reference to 'MainWindow::mouse_button' CMakeFiles/viewer.dir/MainWindow.cpp.o:MainWindow.cpp:function MainWindow::mousePressed(int, int, int, int): error: undefined reference to 'MainWindow::mouse_state' CMakeFiles/viewer.dir/MainWindow.cpp.o:MainWindow.cpp:function MainWindow::render(): error: undefined reference to 'MainWindow::cam' CMakeFiles/viewer.dir/MainWindow.cpp.o:MainWindow.cpp:function MainWindow::render(): error: undefined reference to 'MainWindow::mesh' CMakeFiles/viewer.dir/MainWindow.cpp.o:MainWindow.cpp:function MainWindow::mouseMove(int, int): error: undefined reference to 'MainWindow::mouse_button' CMakeFiles/viewer.dir/MainWindow.cpp.o:MainWindow.cpp:function MainWindow::mouseMove(int, int): error: undefined reference to 'MainWindow::old_y' CMakeFiles/viewer.dir/MainWindow.cpp.o:MainWindow.cpp:function MainWindow::mouseMove(int, int): error: undefined reference to 'MainWindow::old_x' CMakeFiles/viewer.dir/MainWindow.cpp.o:MainWindow.cpp:function MainWindow::mouseMove(int, int): error: undefined reference to 'MainWindow::cam' CMakeFiles/viewer.dir/MainWindow.cpp.o:MainWindow.cpp:function MainWindow::mouseMove(int, int): error: undefined reference to 'MainWindow::cam' CMakeFiles/viewer.dir/MainWindow.cpp.o:MainWindow.cpp:function MainWindow::mouseMove(int, int): error: undefined reference to 'MainWindow::mouse_button' CMakeFiles/viewer.dir/MainWindow.cpp.o:MainWindow.cpp:function MainWindow::mouseMove(int, int): error: undefined reference to 'MainWindow::old_x' CMakeFiles/viewer.dir/MainWindow.cpp.o:MainWindow.cpp:function MainWindow::mouseMove(int, int): error: undefined reference to 'MainWindow::old_y' CMakeFiles/viewer.dir/MainWindow.cpp.o:MainWindow.cpp:function MainWindow::mouseMove(int, int): error: undefined reference to 'MainWindow::mouse_button' CMakeFiles/viewer.dir/MainWindow.cpp.o:MainWindow.cpp:function MainWindow::mouseMove(int, int): error: undefined reference to 'MainWindow::cam' CMakeFiles/viewer.dir/MainWindow.cpp.o:MainWindow.cpp:function MainWindow::MainWindow(Camera*, int, char**): error: undefined reference to 'MainWindow::old_x' CMakeFiles/viewer.dir/MainWindow.cpp.o:MainWindow.cpp:function MainWindow::MainWindow(Camera*, int, char**): error: undefined reference to 'MainWindow::old_y' CMakeFiles/viewer.dir/MainWindow.cpp.o:MainWindow.cpp:function MainWindow::MainWindow(Camera*, int, char**): error: undefined reference to 'MainWindow::mesh' CMakeFiles/viewer.dir/MainWindow.cpp.o:MainWindow.cpp:function MainWindow::MainWindow(Camera*, int, char**): error: undefined reference to 'MainWindow::mesh' CMakeFiles/viewer.dir/MainWindow.cpp.o:MainWindow.cpp:function MainWindow::MainWindow(Camera*, int, char**): error: undefined reference to 'MainWindow::mesh' CMakeFiles/viewer.dir/MainWindow.cpp.o:MainWindow.cpp:function MainWindow::getInstance(Camera*, int, char**): error: undefined reference to 'MainWindow::instance' CMakeFiles/viewer.dir/MainWindow.cpp.o:MainWindow.cpp:function MainWindow::getInstance(Camera*, int, char**): error: undefined reference to 'MainWindow::instance' collect2: ld returned 1 exit status make[2]: *** [viewer] Error 1 make[1]: *** [CMakeFiles/viewer.dir/all] Error 2 make: *** [all] Error 2 

So, the code compiles just fine, it just cannot really link one of the 4 source files..

Edit:

Here is the gist of MainWindow.hpp

class MainWindow { private: MainWindow() {} MainWindow(const MainWindow&) {} MainWindow(Camera *cam, int argc, char* argv[]); static MainWindow *instance; static Camera *cam; static TriangleMesh mesh; static int old_x; static int old_y; static int mouse_button; static int mouse_state; static void mousePressed(int button, int state, int x, int y); static void initGlut(int argc, char* argv[]); static void initCallbacks(); static void render(); static void reshape(int w, int h); static void keyPressed(unsigned char key, int x, int y); static void mouseMove(int x, int y); public: static MainWindow* getInstance(Camera *cam, int argc, char* argv[]); static void setCamera(Camera* cam); static void setMesh(TriangleMesh* mesh); static void destroy(); }; 
2
  • Do he MainWindow class have those members? How are they declared? How are they defined? Commented Nov 19, 2012 at 2:10
  • That's what I checked first. But they defenitely do, and i think the includes are fine as well. The thing is, all object files are compiled niceley, so i guess they are found, too. Just not by the linker. edit: added the declarations. Commented Nov 19, 2012 at 2:13

1 Answer 1

3

If you have static member variables, they need to be defined as well, not only declared:

In a header file:

class Foo { ... // This declares a static member variable static int static_member_variable; ... }; 

In a source file:

// This defines the variable int Foo::static_member_variable; 
Sign up to request clarification or add additional context in comments.

3 Comments

You mean, in order to define lets say, old_x in the .cpp file, it's not enough to write old_x = 0; , but int MainWindow::old_x = 0; ?
@ArneRecknagel Yes, otherwise you just declare a normal global variable.
Thank you so much - I never would have guessed that static member variables were my problem. I needed some time to figure out that the declaration has to be put at the top of the source file, but now that that's done, everything works as fine as I can expect it to. =)

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.