2013-07-20 20 views
25

ho definito un file speciale: config.hmultipla definizione di ... errore di linker

Il mio progetto ha anche i file:

t.c, t.h 
pp.c, pp.h 
b.c b.h 
l.cpp 

e # include:

in tc:

#include "t.h" 
    #include "b.h" 
    #include "pp.h" 
    #include "config.h" 

in bc:

#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" 

non ci sono includere direttive miei file *.h, solo in *.c file . Ho definito questo in config.h:

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

e hanno bisogno di tale matrice in l.cpp, TC, pp.c ma Im ottenendo questo errore:

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 

devo includere guardie in ogni file *.h Io uso nel mio progetto. Qualche aiuto per risolvere questo?

+0

possibile duplicato di [errore di linker a definizione multipla dopo l'aggiunta di una funzione a un file di collegamento precedente] (http://stackoverflow.com/questions/3136616/multiple-definition-linker-error-after-adding-a- funzione-a-un-precedente-collegamento) –

risposta

63

Non definire le variabili nelle intestazioni. Metti le dichiarazioni nell'intestazione e nelle definizioni in uno dei file .c.

In config.h

extern const char *names[]; 

In alcuni file .c:

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

Se si mette una definizione di una variabile globale in un file di intestazione, allora questa definizione andrà ad ogni. c file che include questa intestazione e otterrai più errori di definizione perché una variabile può essere dichiarata più volte ma può essere definita solo una volta.

+0

risolto! :) Potresti dirmi perché non dovrei mettere le dichiarazioni nei file 'h * .'? – mazix

+3

Quindi non lo farà. Utilizzare i file * .h solo per fare riferimento alle informazioni. Devi ricordare che "include" significa che include tutte le informazioni * .h in quel file, quindi copierai quelle informazioni (non solo il riferimento) in ogni file usando * .h.Questo può confondere i linker e lo fa. – Jiminion

+1

@mazix No, la ** definizione ** di una variabile globale dovrebbe andare nel file .c e inserire la ** dichiarazione ** nell'intestazione. Ricorda che puoi dichiarare una variabile molte volte ma definirla solo una volta. –

14

Le dichiarazioni di funzioni pubbliche vengono inserite nei file di intestazione, sì, ma le definizioni sono assolutamente valide anche nelle intestazioni! È possibile dichiarare la definizione come statica (solo una copia consentita per l'intero programma) se si definiscono elementi in un'intestazione per le funzioni di utilità che non si desidera definire nuovamente in ogni file c. OSSIA definire un enum e una funzione statica per tradurre l'enum in una stringa. Quindi non dovrai riscrivere l'enum nel traduttore di stringhe per ogni file .c che include l'intestazione. :)

+1

In realtà trovo questa risposta molto più conveniente di la risposta migliore. È più comodo e interessante avere solo un'intestazione per memorizzare tutte le variabili globali, ad esempio, invece di avere i file .h e .cpp. Grazie. – Saik