Multiple definition of ... linker error

c, linker, linker-errors

Solution

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.

Also, one more thing you can do if you have to define your variables inside of a header file you can use the `static` keyword.

static const char *names[] = {
  "brian", "stefan", "steve" };

This way variable `names` will be defined only once in your entire program and can be accessed multiple number of times.

Problem

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?

Original source