Linkertoolfehler LNK2005

Bereits im Objekt definiertes Symbol

Das Symbolsymbol wurde mehrmals definiert.

Auf diesen Fehler folgt ein schwerwiegender Fehler LNK1169.

Mögliche Ursachen und Lösungen

Im Allgemeinen bedeutet dieser Fehler, dass Sie die eine Definitionsregel unterbrochen haben, die nur eine Definition für jede verwendete Vorlage, Funktion, Typ oder Objekt in einer bestimmten Objektdatei und nur eine Definition für die gesamte ausführbare Datei für extern sichtbare Objekte oder Funktionen zulässt.

Nachfolgend finden Sie einige häufige Ursachen für diesen Fehler.

  • Dieser Fehler kann auftreten, wenn eine Headerdatei eine Variable definiert. Wenn Sie diese Headerdatei z. B. in mehr als eine Quelldatei in Ihr Projekt einschließen, führt ein Fehler zu folgenden Ergebnissen:

    // LNK2005_global.h
    int global_int;  // LNK2005
    

    Folgende Lösungen sind möglich:

    • Deklarieren Sie die Variable extern in der Headerdatei: extern int global_int;, definieren Sie sie, und initialisieren Sie sie optional in einer und nur einer Quelldatei: int global_int = 17;. Diese Variable ist jetzt eine globale, die Sie in einer beliebigen Quelldatei verwenden können, indem Sie sie externdeklarieren, z. B. durch Einschließen der Headerdatei. Wir empfehlen diese Lösung für Variablen, die global sein müssen, aber eine gute Softwareentwicklungspraxis minimiert globale Variablen.

    • Deklarieren Sie die Variable statisch: static int static_int = 17;. Dadurch wird der Bereich der Definition auf die aktuelle Objektdatei beschränkt, und mehrere Objektdateien können über eine eigene Kopie der Variablen verfügen. Es wird nicht empfohlen, statische Variablen in Headerdateien zu definieren, da dies zu Verwirrung mit globalen Variablen führen kann. Verschieben Sie statische Variablendefinitionen lieber in die Quelldateien, die sie verwenden.

    • Deklarieren Sie die Variable selectany: __declspec(selectany) int global_int = 17;. Dadurch wird der Linker aufgefordert, eine Definition für die Verwendung durch alle externen Bezüge zu wählen und den Rest zu Karte dis. Diese Lösung ist manchmal hilfreich beim Kombinieren von Importbibliotheken. Andernfalls wird dies nicht als Möglichkeit empfohlen, Linkerfehler zu vermeiden.

  • Dieser Fehler kann auftreten, wenn eine Headerdatei eine Funktion definiert, die nicht inlinevorhanden ist. Wenn Sie diese Headerdatei in mehr als eine Quelldatei einschließen, erhalten Sie mehrere Definitionen der Funktion in der ausführbaren Datei.

    // LNK2005_func.h
    int sample_function(int k) { return 42 * (k % 167); }  // LNK2005
    

    Folgende Lösungen sind möglich:

    • Fügen Sie der Funktion die inline Schlüsselwort (keyword) hinzu:

      // LNK2005_func_inline.h
      inline int sample_function(int k) { return 42 * (k % 167); }
      
    • Entfernen Sie den Funktionstext aus der Headerdatei, und lassen Sie nur die Deklaration, und implementieren Sie dann die Funktion in einer und nur einer Quelldatei:

      // LNK2005_func_decl.h
      int sample_function(int);
      
      // LNK2005_func_impl.cpp
      int sample_function(int k) { return 42 * (k % 167); }
      
  • Dieser Fehler kann auch auftreten, wenn Sie Memberfunktionen außerhalb der Klassendeklaration in einer Headerdatei definieren:

    // LNK2005_member_outside.h
    class Sample {
    public:
        int sample_function(int);
    };
    int Sample::sample_function(int k) { return 42 * (k % 167); }  // LNK2005
    

    Um dieses Problem zu beheben, verschieben Sie die Memberfunktionsdefinitionen innerhalb der Klasse. Memberfunktionen, die in einer Klassendeklaration definiert sind, sind implizit inlined.

    // LNK2005_member_inline.h
    class Sample {
    public:
        int sample_function(int k) { return 42 * (k % 167); }
    };
    
  • Dieser Fehler kann auftreten, wenn Sie mehrere Versionen der Standardbibliothek oder CRT verknüpfen. Wenn Sie z. B. versuchen, sowohl die Einzelhandels- als auch die Debug-CRT-Bibliotheken oder die statischen und dynamischen Versionen einer Bibliothek oder zwei verschiedene Versionen einer Standardbibliothek mit Ihrer ausführbaren Datei zu verknüpfen, kann dieser Fehler oft gemeldet werden. Um dieses Problem zu beheben, entfernen Sie alle Kopien jeder Bibliothek aus dem Linkbefehl. Es wird nicht empfohlen, Einzelhandels- und Debugbibliotheken oder verschiedene Versionen einer Bibliothek in derselben ausführbaren Datei zu kombinieren.

    Um dem Linker mitzuteilen, dass andere Bibliotheken als die Standardbibliotheken verwendet werden sollen, geben Sie in der Befehlszeile die zu verwendenden Bibliotheken an, und verwenden Sie die Option "/NODEFAULTLIB ", um die Standardbibliotheken zu deaktivieren. Fügen Sie in der IDE Verweise auf Ihr Projekt hinzu, um die zu verwendenden Bibliotheken anzugeben, und öffnen Sie dann das Dialogfeld "Eigenschaftenseiten" für Ihr Projekt, und legen Sie auf der Seite "Linker", "Eingabeeigenschaften" entweder "Alle Standardbibliotheken ignorieren" oder "Bestimmte Standardbibliotheken ignorieren" fest, um die Standardbibliotheken zu deaktivieren.

  • Dieser Fehler kann auftreten, wenn Sie statische und dynamische Bibliotheken kombinieren, wenn Sie die Option "/clr " verwenden. Dieser Fehler kann beispielsweise auftreten, wenn Sie eine DLL für die Verwendung in Ihrer ausführbaren Datei erstellen, die in der statischen CRT verknüpft ist. Um dieses Problem zu beheben, verwenden Sie nur statische Bibliotheken oder nur dynamische Bibliotheken für die gesamte ausführbare Datei und für alle Bibliotheken, die Sie in der ausführbaren Datei verwenden.

  • Dieser Fehler kann auftreten, wenn es sich bei dem Symbol um eine verpackte Funktion handelt (die durch Kompilieren mit /Gy erstellt wurde) und sie in mehr als einer Datei enthalten war, aber zwischen Kompilierungen geändert wurde. Um dieses Problem zu beheben, kompilieren Sie alle Dateien, die die verpackte Funktion enthalten.

  • Dieser Fehler kann auftreten, wenn das Symbol in zwei Memberobjekten in unterschiedlichen Bibliotheken unterschiedlich definiert ist und beide Memberobjekte verwendet werden. Eine Möglichkeit, dieses Problem zu beheben, wenn die Bibliotheken statisch verknüpft sind, besteht darin, das Memberobjekt nur aus einer Bibliothek zu verwenden und diese Bibliothek zuerst in die Befehlszeile des Linkers einzuschließen. Um beide Symbole zu verwenden, müssen Sie eine Möglichkeit zum Unterscheiden dieser Symbole erstellen. Wenn Sie beispielsweise die Bibliotheken aus der Quelle erstellen können, können Sie jede Bibliothek in einen eindeutigen Namespace umschließen. Alternativ können Sie eine neue Wrapperbibliothek erstellen, die eindeutige Namen verwendet, um Verweise auf eine der ursprünglichen Bibliotheken umzuschließen, die neue Bibliothek mit der ursprünglichen Bibliothek zu verknüpfen und dann die ausführbare Datei mit Ihrer neuen Bibliothek anstelle der ursprünglichen Bibliothek zu verknüpfen.

  • Dieser Fehler kann auftreten, wenn eine extern const Variable zweimal definiert ist und in jeder Definition einen anderen Wert aufweist. Um dieses Problem zu beheben, definieren Sie die Konstante nur einmal, oder verwenden Sie Namespaces oder enum class Definitionen, um die Konstanten zu unterscheiden.

  • Dieser Fehler kann auftreten, wenn Sie uuid.lib in Kombination mit anderen LIB-Dateien verwenden, die GUIDs definieren (z. B. oledb.lib und adsiid.lib). Beispiel:

    oledb.lib(oledb_i.obj) : error LNK2005: _IID_ITransactionObject
    already defined in uuid.lib(go7.obj)
    

    Um dieses Problem zu beheben, fügen Sie "/FORCE:MULTIPLE " zu den Linker-Befehlszeilenoptionen hinzu, und stellen Sie sicher, dass uuid.lib die erste Bibliothek ist, auf die verwiesen wird.