I defined a special file: config.h
My project also has files:
t.c, t.h
pp.c, pp.h
b.c b.h
l.cpp
and #includes:
in t.c:
#include "t.h"
#include "b.h"
#include "pp.h"
#include "config.h"
in b.c:
#include "b.h"
#include "pp.h"
in pp.c:
#include "pp.h"
#include "config.h"
in l.cpp:
#include "pp.h"
#include "t.h"
#include "config.h"
there are no include directives in my *.h
files, only in *.c
files. I defined this in config.h:
const char *names[i] =
{
"brian", "stefan", "steve"
};
and need that array in l.cpp, t.c, pp.c but Im getting this error:
pp.o:(.data+0x0): multiple definition of `names'
l.o:(.data+0x0): first defined here
t.o:(.data+0x0): multiple definition of `names'
l.o:(.data+0x0): first defined here
collect2: ld returned 1 exit status
make: *** [link] Error 1
I have include guards in every *.h
file I use in my project. Any help solving this?
This question is related to
c
linker
linker-errors
Don't define variables in headers. Put declarations in header and definitions in one of the .c files.
In config.h
extern const char *names[];
In some .c file:
const char *names[] =
{
"brian", "stefan", "steve"
};
If you put a definition of a global variable in a header file, then this definition will go to every .c file that includes this header, and you will get multiple definition error because a varible may be declared multiple times but can be defined only once.
Declarations of public functions go in header files, yes, but definitions are absolutely valid in headers as well! You may declare the definition as static (only 1 copy allowed for the entire program) if you are defining things in a header for utility functions that you don't want to have to define again in each c file. I.E. defining an enum and a static function to translate the enum to a string. Then you won't have to rewrite the enum to string translator for each .c file that includes the header. :)
Source: Stackoverflow.com