undefined reference to 'function'

Started by
8 comments, last by Aardvajk 11 years, 8 months ago
Hi everyone,
I am facing a very weird compiling error. I am using OpenGL with code::blocks IDE. However, I don't think that this problem is related to OpenGL at all.

I am using math.h header file. I have an GLfloat variable that contains an angle in degrees. However, when I use this angle for sin() or cos() functions it needs to be in radians. Hence, I created a separate class named "Misc" in a separate header file that has this conversion function

Misc.h

#ifndef MISC_H_INCLUDED
#define MISC_H_INCLUDED
#include <GL\gl.h>
#include <GL\glu.h>
class Misc
{
public:
Misc() {}
static GLfloat toRadians(GLfloat degrees);
static void foo();
};

#endif // MISC_H_INCLUDED


Misc.cpp

#include "Misc.h"
GLfloat Misc::toRadians(GLfloat degrees)
{
return degrees * (3.14159265f / 180.0f);
}
void Misc::foo()
{
}


hence, whenever I call these functions anywhere in the program, I get compilation errors of "undefined reference to 'Misc::toRadians(float)' "
and "undefined reference to 'Misc::foo()' "

however, wherever I am calling these functions, I have checked that I am including this header file in that source file....

both Misc.h and Misc.cpp are in the same folder....

However, I noticed that I defined the functions in Misc class itself, then I have no errors, If I define these functions outside the class in the same header file then I get multiple definitions error....

I am completely struck and I can't figure out what I am doing wrong here...?

Thanks for any help, appreciate it....
Advertisement
Linker errors like this usually means that the linker can't find the compiled product of something. Is it or have you tried having all files in the same directory?
Are you sure Misc.cpp is being compiled? Also, why not just use a free function?


about the free function, I can use it, but what I am trying to do here right now is I have done before in previous projects without any problem, its just you know... a good programming practice...


[quote name='SamiHuutoniemi' timestamp='1344265081' post='4966677']
Linker errors like this usually means that the linker can't find the compiled product of something. Is it or have you tried having all files in the same directory?


Edit: after reading your post several times, I realized something and I checked the project properties and all the files that are to be compiled were not checked in.... apparently Misc.h and Misc.cpp were'nt checked to be compiled.... I checked both of these files and now the code runs just fine...... :)
I wouldn't say that it's better programming practice to put them in a class and make them static. You could use a namespace instead.

But to be honest, without the possibility to sit in front of your screen, it's hard to say why it doesn't link.

I wouldn't say that it's better programming practice to put them in a class and make them static. You could use a namespace instead.

But to be honest, without the possibility to sit in front of your screen, it's hard to say why it doesn't link.


you were right, error was generating because Misc.h and Misc.cpp were not compiling for some reason, I had to go to the project properties and check these to files in the build targets and now it works just fine.....

about good programming practice part.... I am an amateur in programming so these functions can be used anywhere in the program hence made them in class so that they will be easily addressed and made them static so that I won't have to create the object of the class to use them.... these are more like global functions....
Nice to hear it works!

Exactly for this reason (to be used like global functions), I'd make them free functions instead. But if you are making an engine that will/can be used by others, it IS good practice to put them in a class or namespace. Namespaces, however, are a bit simpler, and you can use "using" to get rid of the namespace::-part to make very readable code.

about good programming practice part.... I am an amateur in programming so these functions can be used anywhere in the program hence made them in class so that they will be easily addressed and made them static so that I won't have to create the object of the class to use them.... these are more like global functions....

Use free functions and group functions together using namespaces.

Use free functions and group functions together using namespaces.


Sure, I will try that next time.... :)
Purely technically speaking, it's better programming practice to use a free function rather than even a static class method because each static class method can access the private members of the class, so becomes yet one more place where you could potentially inviolate class invariants.

From a purist perspective, any method that does not actually require access to the implementation of a class should not be part of that class interface.

This topic is closed to new replies.

Advertisement