Alex Rivera | Logout

"Multiple definition of" C++ compiler error

Asked 2009-03-26T11:53:37.340
15

I can't seem to get rid of these seemingly random compiles errors in one of my classes. I get about 4 errors such as:

multiple definition of `draw_line(float, float, float, float)'

and

multiple definition of `near_far_clip(float, float, float*, float*, float*, float*, float*, float*)'

that are flagged in the middle of the method.

I also consistently get multiple definition of `stack' in the middle of another method. stack is a global variable in a totally different file. It isn't even mentioned in the file I'm getting the error in.

I tried separating the error prone file into .h and .cpp files (was originally just a .cpp) and nothing about the error changed...

I don't have duplicate methods. I only have one #include of lines.h and there is an #ifndef clause at the beginning. All these errors appear in the .cpp file.

Any ideas what it could be?

Alright, I got the code up:

The lines.cpp is a converted .c file I received from my instructor. I included the makefile just in case, because I always have problems with it. I also annotated exactly where the errors were flagged in the file, but they seem pretty random so I don't know if it's particularly important. I abandoned the .h file because it wasn't solving anything or helping. I believe it will be easier to find the mistake without it.

Here is the requested main.cpp file (there is no .h).


I remade the lines.h fi

Edit
Report

1 Answer

3

As has been said - not enough information to properly diagnose here.

But if draw_line et al are defined in a header file rather than in a source (cpp) file, you may have methods which are supposedly declared as inline in the header file, which aren't actually properly inlining. In that case, each .cpp file that includes the header will generate their own definition of the draw_line function, and generate warnings at link time.

This can happen if you use a #defined INLINE macro which comes from a system header that has been forgotten or removed, and for whatever reason the INLINE gets pre-processed away into nothing.

E.g.:

//Lines.h

#define GCCC //Note the typo

#if defined(GCC)
#define INLINE inline
#elif defined (MSVC)
#define INLINE __inline
#else

#define INLINE //Due to the typo, INLINE will be turned into nothing
#endif

INLINE void draw_line(float x1, float y1, float x2, float y2)
{
   //Draw the line
}

//File1.cpp
#include "lines.h" //will define draw_line

//File2.cpp
#include "lines.h" //will also define draw_line

And linking File1.cpp and File2.cpp will generate multiple declaration errors

answered 2009-03-26T12:22:43.370

Your Answer