Definición múltiple de... error del enlazador
linker linker-errors (2)
He definido un archivo especial: config.h
Mi proyecto también tiene archivos:
t.c, t.h
pp.c, pp.h
b.c b.h
l.cpp
y #incluye:
en tc:
#include "t.h"
#include "b.h"
#include "pp.h"
#include "config.h"
en bc:
#include "b.h"
#include "pp.h"
en pp.c:
#include "pp.h"
#include "config.h"
en l.cpp:
#include "pp.h"
#include "t.h"
#include "config.h"
no hay directivas de inclusión en mis archivos *.h
, solo en los archivos *.c
. Definí esto en config.h:
const char *names[i] =
{
"brian", "stefan", "steve"
};
y necesito esa matriz en l.cpp, tc, pp.c pero obtengo este 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
He incluido guardas en todos los archivos *.h
que uso en mi proyecto. ¿Alguna ayuda para resolver esto?
Las declaraciones de funciones públicas van en archivos de encabezado, sí, ¡pero las definiciones también son absolutamente válidas en los encabezados! Puede declarar la definición como estática (solo se permite 1 copia para todo el programa) si está definiendo cosas en un encabezado para funciones de utilidad que no desea tener que definir nuevamente en cada archivo c. IE define una enumeración y una función estática para traducir la enumeración a una cadena. Entonces no tendrá que volver a escribir la enumeración en el traductor de cadenas para cada archivo .c que incluya el encabezado. :)
No defina variables en los encabezados. Ponga las declaraciones en el encabezado y las definiciones en uno de los archivos .c.
En config.h
extern const char *names[];
En algún archivo .c:
const char *names[] =
{
"brian", "stefan", "steve"
};
Si coloca una definición de una variable global en un archivo de encabezado, esta definición irá a cada archivo .c que incluya este encabezado, y obtendrá un error de definición múltiple porque una variable puede declararse varias veces pero solo puede definirse una vez. .