Log in

View Full Version : Multiple Definitions


bronxbomber92
08-02-2008, 16:40
I've created a new file, where I keep all of this years code. When I compile my project I get an error saying symbol 'ReleasingBall' has multiple definitions.

Here's how my files are organized:

custom_routines.h
#ifndef _CUSTOM_ROUTINES_H_
#define _CUSTOM_ROUTINES_H_

//...
bool ReleasingBall;
//...
#endif


custom_routines.c
#include <timer.h>
#include "custom_routines.h"

// function definitions


user_routines.h

//..
#include "custom_routines.h"

// all of my custom code is commented out, so beside the above include directive, everything is in its original state


Why am I getting this error, the include guards should be preventing this problem!

psy_wombats
08-02-2008, 16:50
I'd think that variable would need to be declared global and then marked extern in all other files that use it. Or something like that, I forget the exact procedure.

Alan Anderson
08-02-2008, 16:55
When you copy a project to a new folder, you should Clean (or Build all) to get rid of any leftover pointers to the old files. Until you do that, the linker appears to get confused, complaining about what looks like duplicate copies of the object files.

[Edit:]

Oh! You're not supposed to declare variables in .h files. The bool ReleasingBall; line belongs in custom_routines.c instead, and what goes in custom_routines.h should be extern bool ReleasingBall; (though I'm not sure where bool is defined).

wireties
08-02-2008, 17:00
You want the compiler to encounter only one declaration for the variable as it processes the set of source source files. Your technique above is designed to prevent multiple references or forward references to be encountered , not multiple variables. I'm sure your custom_routines.h file is processed when you compile multiple separate source files.

So do his, change the statement in custom_routines.h to an external reference and declare storage for the variable in ONLY one source file.

In custom_routines.h, do this:

#ifndef _CUSTOM_ROUTINES_H_
#define _CUSTOM_ROUTINES_H_
...
extern bool ReleasingBall;
...
#endif

In custom_routines.c, do this:

....
#include <timer.h>
#include "custom_routines.h"

bool ReleasingBall; // defined only here!

// function definitions
...

One last thing, it is generally considered bad style to define storage in a header file for exactly the reason you have encountered.

HTH

bronxbomber92
08-02-2008, 17:03
When you copy a project to a new folder, you should Clean (or Build all) to get rid of any leftover pointers to the old files. Until you do that, the linker appears to get confused, complaining about what looks like duplicate copies of the object files.

[Edit:]

Oh! You're not supposed to declare variables in .h files. The bool ReleasingBall; line belongs in custom_routines.c instead, and what goes in custom_routines.h should be extern bool ReleasingBall; (though I'm not sure where bool is defined).

Thanks, worked great!

I defined bool my self with a few typedefs and defines :)