2013-07-20 13 views
25

I definiert eine spezielle Datei: config.hMultiple Definition ... Linkerfehler

Mein Projekt hat auch Dateien:

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

und #includes:

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" 

gibt es keine Richtlinien sind in meiner *.h Dateien nur in *.c Dateien . I definiert dies in config.h:

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

und brauchen dieses Array in l.cpp, tc, pp.c aber ich bin diesen Fehler:

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 enthalten haben Wachen in jeder *.h Datei Ich benutze in meinem Projekt. Irgendeine Hilfe, um das zu lösen?

+0

möglich duplicate von [mehrere Definition Linker-Fehler nach dem Hinzufügen einer Funktion zu einer zuvor verknüpften Datei] (http://StackOverflow.com/Questions/3136616/Multiple-Definition-Linker-Error-after-Adding-a- Funktion-zu-einem-Vorgänger-Verknüpfung) –

Antwort

63

Variablen nicht in Headern definieren. Setzen Sie Deklarationen in Header und Definitionen in eine der C-Dateien.

In config.h

extern const char *names[]; 

In einigen C-Datei:

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

Wenn Sie eine Definition einer globalen Variablen in einer Header-Datei setzen, dann wird diese Definition zu jeder gehen. c-Datei, die diesen Header enthält, und Sie erhalten mehrere Definitionsfehler, da eine Variable mehrfach deklariert werden kann, aber nur einmal definiert werden kann.

+0

gelöst! :) Kannst du mir bitte sagen, warum ich Deklarationen nicht in 'h * .' Dateien ablegen sollte? – mazix

+3

So wird es das nicht tun. Verwenden Sie * .h Dateien, nur um Informationen zu referenzieren. Sie müssen sich daran erinnern, dass "include" bedeutet, dass es alle * .h Informationen in dieser Datei enthält, so dass Sie diese Informationen (nicht nur die Referenz) in jede Datei mit dem * .h kopieren würden.Dies kann Linker verwirren und tut es. – Jiminion

+1

@mazix Nein, die ** Definition ** einer globalen Variablen sollte in die .c Datei gehen und die ** Deklaration ** in die Kopfzeile setzen. Denken Sie daran, dass Sie eine Variable mehrmals deklarieren können, aber nur einmal definieren. –

14

Deklarationen von öffentlichen Funktionen gehen in Header-Dateien, ja, aber Definitionen sind auch in Headern absolut gültig! Sie können die Definition als statisch deklarieren (nur 1 Kopie für das gesamte Programm zulässig), wenn Sie Dinge in einer Kopfzeile für Dienstprogrammfunktionen definieren, die Sie nicht erneut in jeder c-Datei definieren müssen. I.E. Definieren einer Enumeration und einer statischen Funktion zum Umwandeln der Enumeration in eine Zeichenfolge. Dann müssen Sie den Enum-String-Übersetzer für jede .c-Datei, die den Header enthält, nicht neu schreiben. :)

+1

Ich finde diese Antwort tatsächlich viel bequemer als die beste Antwort. Es ist bequemer und ansprechender, nur einen Header zu haben, um zum Beispiel alle globalen Variablen zu speichern, anstatt .h- und .cpp-Dateien zu haben. Vielen Dank. – Saik