Mehrfachdefinition von … Linkerfehler

Lesezeit: 5 Minuten

Benutzeravatar von mazix
mazix

Ich habe eine spezielle Datei definiert: config.h

Mein Projekt hat auch Dateien:

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

und #beinhaltet:

im TC:

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

in BC:

    #include "b.h"
    #include "pp.h"

in ppc:

    #include "pp.h"
    #include "config.h"

in l.cpp:

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

Es gibt keine Include-Direktiven in my *.h Dateien, nur in *.c Dateien. Ich habe dies in config.h definiert:

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

und brauche dieses Array in l.cpp, tc, pp.c, aber ich erhalte 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: *** https://stackoverflow.com/questions/17764661/multiple-definition-of-linker-error Error 1

Ich habe Wachen in jedem enthalten *.h Datei, die ich in meinem Projekt verwende. Irgendwelche Hilfe bei der Lösung?

  • Mögliches Duplikat eines Linkerfehlers mit mehreren Definitionen nach dem Hinzufügen einer Funktion zu einer zuvor verknüpften Datei

    Benutzer529758

    20. Juli 2013 um 18:36 Uhr

  • Gibt es eine kürzliche Änderung in Debian? Bis vor ein paar Tagen wurde mein Projekt gut kompiliert…. Ich fing an, diesen Fehler zu bekommen (sogar für Revisionen, die ich markiert habe und die vor ein paar Tagen gut funktionierten) nach den letzten Updates (ich bin beim Debian-Testen).

    – eftshift0

    15. August 2020 um 4:04 Uhr

Benutzeravatar von Yu Hao
Yu Hao

Definieren Sie keine Variablen in Headern. Legen Sie Deklarationen im Header und Definitionen in einer der .c-Dateien ab.

In config.h

extern const char *names[];

In einigen .c-Dateien:

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

Wenn Sie eine Definition einer globalen Variablen in eine Headerdatei einfügen, wird diese Definition in jede .c-Datei eingefügt, die diesen Header enthält, und Sie erhalten einen Mehrfachdefinitionsfehler, da eine Variable möglicherweise mehrmals deklariert, aber nur einmal definiert werden kann .

Außerdem können Sie noch etwas tun, wenn Sie Ihre Variablen in einer Header-Datei definieren müssen, die Sie verwenden können static Stichwort.

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

Dadurch variabel names wird in Ihrem gesamten Programm nur einmal definiert und kann mehrfach aufgerufen werden.

  • gelöst! 🙂 Könnten Sie mir bitte sagen, warum ich keine Deklarationen einfügen sollte h*. Dateien?

    – Mazix

    20. Juli 2013 um 17:30 Uhr

  • Also wird es das nicht tun. Verwenden Sie *.h-Dateien nur, um auf Informationen zu verweisen. Sie müssen sich daran erinnern, dass “include” bedeutet, dass alle *.h-Informationen in dieser Datei enthalten sind, sodass Sie diese Informationen (nicht nur die Referenz) in jede Datei kopieren würden, die die *.h verwendet. Dies kann Linker verwirren und tut es auch.

    – Jiminion

    20. Juli 2013 um 17:34 Uhr

  • @mazix Nein, die Definition einer globalen Variablen sollte in die .c-Datei gehen und die Erklärung in der Kopfzeile. Denken Sie daran, dass Sie eine Variable viele Male deklarieren, aber nur einmal definieren können.

    – Yu Hao

    20. Juli 2013 um 17:34 Uhr

  • Nur um die Erklärung etwas klarer zu machen, die Header-Datei ist wahrscheinlich in mehr als einer c-Datei enthalten, sodass Sie am Ende mehrere Deklarationen einer Variablen mit demselben Namen haben werden

    – Spalter

    20. Juli 2013 um 18:17 Uhr

  • ist es möglich zu verwenden extern für Klassenkonstruktor?

    – Ebrahim Karimi

    27. Oktober 2018 um 20:07 Uhr

Deklarationen öffentlicher Funktionen gehören 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 erlaubt), wenn Sie Dinge in einem Header für Hilfsfunktionen definieren, die Sie nicht in jeder c-Datei erneut definieren müssen. IE definiert eine Aufzählung und eine statische Funktion, um die Aufzählung in eine Zeichenfolge zu übersetzen. Dann müssen Sie den Enum-zu-String-Übersetzer nicht für jede .c-Datei, die den Header enthält, neu schreiben. 🙂

  • Ich finde diese Antwort tatsächlich viel bequemer als die oberste Antwort. Es ist praktischer und ansprechender, nur einen Header zu haben, um beispielsweise alle globalen Variablen zu speichern, anstatt .h- und .cpp-Dateien zu haben. Vielen Dank.

    – Sag

    28. Mai 2017 um 2:25 Uhr

  • Ich denke auch, dass diese Lösung besser ist als die am meisten gewählte, weil die andere Werte in jeder *.c-Datei definieren muss, und außerdem sieht deine, @JonathanWhittenberg, eleganter aus. Danke vielmals

    – Alejandro Galera

    3. Mai 2018 um 8:59 Uhr

  • Bessere und elegantere Lösung als die AA. +1 für das Hinzufügen, warum es nicht immer eine schlechte Idee ist.

    – SimonC

    8. Januar 2019 um 16:16 Uhr

  • Dies ist keine genaue Beschreibung dessen, was Statik tut. “Sie können die Definition als statisch deklarieren (nur 1 Kopie für das gesamte Programm erlaubt)” NEIN! static legt die Definition auf diese Kompiliereinheit fest. Sie erhalten also eine Kopie pro kompilieren Einheit. Wenn Sie also eine große Liste von Zeichenfolgen haben, wird Ihr Programm am Ende viele doppelte Kopien dieser Liste haben … eine für jede c-Datei. Dies ist noch schlimmer für statische Funktionen, wenn Sie diese später debuggen, da es nicht mehr eine einzelne Funktion gibt, auf der ein Haltepunkt platziert werden kann, sondern viele Kopien dieser Funktion im resultierenden verknüpften Programm.

    – PPinguin

    7. Juni 2019 um 23:20 Uhr


Machen Sie Ihre Definitionen in den Header-Dateien statisch.

  • Ihre Antwort könnte durch zusätzliche unterstützende Informationen verbessert werden. Bitte bearbeiten Sie, um weitere Details wie Zitate oder Dokumentation hinzuzufügen, damit andere bestätigen können, dass Ihre Antwort richtig ist. Weitere Informationen zum Verfassen guter Antworten finden Sie in der Hilfe.

    – Gemeinschaft
    bot

    7. Februar um 12:10 Uhr

1417440cookie-checkMehrfachdefinition von … Linkerfehler

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy