LNK2005-Fehler bei falscher Verknüpfung von CRT-Bibliothek und MFC-Bibliotheken in Visual C++

SPRACHE AUSWÄHLEN SPRACHE AUSWÄHLEN
Artikel-ID: 148652 - Produkte anzeigen, auf die sich dieser Artikel bezieht
Dieser Artikel ist eine Übersetzung des folgenden englischsprachigen Artikels der Microsoft Knowledge Base:
148652 A LNK2005 error occurs when the CRT library and MFC libraries are linked in the wrong order in Visual C++
Bitte beachten Sie: Bei diesem Artikel handelt es sich um eine Übersetzung aus dem Englischen. Es ist möglich, dass nachträgliche Änderungen bzw. Ergänzungen im englischen Originalartikel in dieser Übersetzung nicht berücksichtigt sind. Die in diesem Artikel enthaltenen Informationen basieren auf der/den englischsprachigen Produktversion(en). Die Richtigkeit dieser Informationen in Zusammenhang mit anderssprachigen Produktversionen wurde im Rahmen dieser Übersetzung nicht getestet. Microsoft stellt diese Informationen ohne Gewähr für Richtigkeit bzw. Funktionalität zur Verfügung und übernimmt auch keine Gewährleistung bezüglich der Vollständigkeit oder Richtigkeit der Übersetzung.
Alles erweitern | Alles schließen

Auf dieser Seite

Problembeschreibung

Wenn die CRT-Bibibliothek (CRT = C Run-Time) und die MFC-Bibliotheken (MFC = Microsoft Foundation Class) in der falschen Reihenfolge verknüpft werden, kann eine der folgenden LNK2005-Fehlermeldungen angezeigt werden:
nafxcwd.lib(afxmem.obj) : error LNK2005:
"void * __cdecl operator new(unsigned int)"(??2@YAPAXI@Z) already
defined in LIBCMTD.lib(new.obj)
nafxcwd.lib(afxmem.obj) : error LNK2005:
"void __cdecl operator delete(void *)"(??3@YAXPAX@Z) already defined
in LIBCMTD.lib(dbgnew.obj)
nafxcwd.lib(afxmem.obj) : error LNK2005:
"void * __cdecl operator new(unsigned int,int,char const *,int)"
(??2@YAPAXIHPBDH@Z) already defined in LIBCMTD.lib(dbgnew.obj)
mfcs40d.lib(dllmodul.obj): error LNK2005: _DllMain@12 already defined in
MSVCRTD.LIB (dllmain.obj)
mfcs42d.lib(dllmodul.obj): error LNK2005: _DllMain@12 already defined in
msvcrtd.lib(dllmain.obj)

Ursache

Die CRT-Bibliotheken verwenden eine schwache externe Bindung für die Funktionen new, delete und DllMain. Die MFC-Bibliotheken enthalten ebenfalls die Funktionen new, delete und DllMain. Diese Funktionen erfordern, dass die MFC-Bibliotheken vor der CRT-Bibliothek verknüpft werden.

Lösung

Es gibt zwei Möglichkeiten, dieses Problem zu beheben: Die erste Lösung besteht darin, den Linker dazu zu zwingen, die Bibliotheken in der richtigen Reihenfolge zu verknüpfen. Die zweite Lösung besteht darin, das Modul zu suchen, das das Problem verursacht, und es zu korrigieren.

Hinweis: Die folgenden Schritte basieren auf Visual C++ 6.0.

Lösung 1: Erzwingen, dass der Linker die Bibliotheken in der richtigen Reihenfolge verknüpft

  1. Klicken Sie im Menü Projekt auf Einstellungen.
  2. Aktivieren Sie in der Ansicht Einstellungen für des Dialogfeldes Projekteinstellungen die Projektkonfiguration, bei der die Verknüpfungsfehler auftreten.
  3. Aktivieren Sie auf der Registerkarte Link die Option Eingabe im Kombinationsfeld Kategorie.
  4. Fügen Sie im Feld Bibliotheken ignorieren die Bibliotheksnamen hinzu (z. B. Nafxcwd.lib;Libcmtd.lib).

    Hinweis: Die Entsprechung in der Linker-Befehlszeile lautet "/NOD:<Bibliotheksname>".
  5. Geben Sie im Feld Objekt-/Bibliotheksmodule die Bibliotheksnamen ein. Sie müssen sicherstellen, dass die Namen in der richtigen Reihenfolge und als die zwei ersten Bibliotheken in der Zeile angegeben sind (z. B. Nafxcwd.lib Libcmtd.lib).
Anweisungen zum Einstellen dieser Option in Visual C++ .NET finden Sie im Onlinehilfethema zum Festlegen von Visual C++-Projekteigenschaften.

Lösung 2: Suchen und Korrigieren des fehlerhaften Moduls

Gehen Sie folgendermaßen vor, um die aktuelle Verknüpfungsreihenfolge der Bibliotheken anzuzeigen:
  1. Klicken Sie im Menü Projekt auf Einstellungen.
  2. Aktivieren Sie in der Ansicht Einstellungen für des Dialogfeldes Projekteinstellungen die Projektkonfiguration, bei der die Verknüpfungsfehler auftreten.
  3. Auf der Registerkarte Link im Feld Projektoptionen geben Sie /verbose:lib ein.
  4. Erstellen Sie das Projekt neu. Die Bibliotheken werden während des Verknüpfungsvorgangs im Ausgabefenster angezeigt.

Status

Es handelt sich hierbei um ein beabsichtigtes Verhalten.

Weitere Informationen

Bei Verwendung der MFC-Bibliotheken müssen Sie sicherstellen, dass sie vor der CRT-Bibliothek verknüpft werden. Das erreichen Sie, indem Sie sicherstellen, dass jede Datei in Ihrem Projekt zuerst die Includedatei "Msdev\Mfc\Include\Afx.h" enthält, entweder direkt (#include <Afx.h>) oder indirekt (#include <Stdafx.h>). Die Includedatei "Afx.h" erzwingt durch Verwendung der #pragma-Kommentar-Direktive (lib,"<libname>") die richtige Reihenfolge der Bibliotheken.

Wenn die Quelldatei eine .c-Erweiterung hat oder die Datei eine .cpp-Erweiterung hat, aber MFC nicht verwendet, können Sie am Anfang des Moduls eine kleine Headerdatei erstellen und als Include aufnehmen. Dieser neue Header stellt sicher, dass die Suchreihenfolge für die Bibliotheken korrekt ist.

Visual C++ enthält diese Headerdatei nicht. Gehen Sie folgendermaßen vor, um diese Datei zu erstellen:
  1. Öffnen Sie "Msdev\Mfc\Include\Afx.h".
  2. Markieren Sie die Zeilen zwischen #ifndef _AFX_NOFORCE_LIBS und #endif //!_AFX_NOFORCE_LIBS.
  3. Kopieren Sie den markierten Bereich in die Windows-Zwischenablage.
  4. Erstellen Sie eine neue Textdatei.
  5. Fügen Sie den Inhalt der Zwischenablage in diese neue Datei ein.
  6. Speichern Sie die Datei als "Msdev\Mfc\Include\Forcelib.h".

Schritte zum Reproduzieren des Problems in Visual C++ .NET

  1. Starten Sie Microsoft Visual Studio .NET.
  2. Zeigen Sie im Menü Datei auf Neu, und klicken Sie dann auf Projekt.
  3. Unter Projekttypen klicken Sie auf Visual C#-Projekte. Wählen Sie dann unter Vorlagen die Option MFC-Anwendung.
  4. Im Textfeld Name geben Sie Q148652 ein.
  5. Im Feld Speicherort geben Sie C:\Test ein. Klicken Sie anschließend auf OK.
  6. Klicken Sie im Dialogfeld MFC-Anwendungs-Assistent auf Anwendungstyp.
  7. Klicken Sie unter Anwendungstyp auf Dialogfeldbasierend und anschließend unter Verwendung von MFC auf MFC in einer statischen Bibliothek verwenden.
  8. Klicken Sie auf Fertig stellen.
  9. Markieren Sie im Projektmappen-Explorer unter Quelldateien alle drei .cpp-Dateien.
  10. Klicken Sie mit der rechten Maustaste auf die drei markierten Dateien. Klicken Sie anschließend auf Entfernen.
  11. Klicken Sie mit der rechten Maustaste auf Quelldateien, zeigen Sie auf Hinzufügen, und klicken Sie auf Neues Element hinzufügen.
  12. Klicken Sie unter Vorlagen auf C++-Dateien. Im Textfeld Name geben Sie Aa ein. Klicken Sie auf Öffnen.
  13. Fügen Sie den folgenden Code in die Datei "Aa.cpp" ein:
    int test(){new int; return 1;}
  14. Klicken Sie mit der rechten Maustaste auf Quelldateien, zeigen Sie auf Hinzufügen, und klicken Sie auf Vorhandenes Element hinzufügen.
  15. Markieren Sie die folgenden Dateien:
    • Q148652.cpp
    • Q148652Dlg.cpp
    • stdafx.cpp
  16. Klicken Sie auf Öffnen.
  17. Die Dateien, die Sie in Schritt 15 markiert haben, werden unter Quelldateien angezeigt.
  18. Markieren Sie alle vier .cpp-Dateien unter Quelldateien.
  19. Klicken Sie mit der rechten Maustaste auf die vier markierten .cpp-Dateien. Klicken Sie anschließend auf Eigenschaften.
  20. Erweitern Sie Konfigurationseigenschaften und dann C/C++.
  21. Klicken Sie auf Vorkompilierte Header.
  22. Stellen Sie die Eigenschaft Erstellen/Verwenden eines vorkompilierten Headers auf Vorkompilierte Header nicht verwenden ein. Klicken Sie auf OK.
  23. Klicken Sie im Menü Erstellen auf Projektmappe neu erstellen.

Eigenschaften

Artikel-ID: 148652 - Geändert am: Freitag, 10. Februar 2006 - Version: 6.1
Die Informationen in diesem Artikel beziehen sich auf:
  • Microsoft Visual C++ 4.0 Standard Edition
  • Microsoft Visual C++ 4.1 Subscription
  • Microsoft Visual C++ 5.0 Enterprise Edition
  • Microsoft Visual C++ 6.0 Enterprise Edition
  • Microsoft Visual C++ 5.0 Professional Edition
  • Microsoft Visual C++ 6.0 Professional Edition
  • Microsoft Visual C++, 32-bit Learning Edition 6.0
  • Microsoft Visual C++ .NET 2002 Standard Edition
  • Microsoft Visual C++ .NET 2003 Standard Edition
Keywords: 
kberrmsg kbtshoot kbprb kbarttypeinf KB148652
Microsoft stellt Ihnen die in der Knowledge Base angebotenen Artikel und Informationen als Service-Leistung zur Verfügung. Microsoft übernimmt keinerlei Gewährleistung dafür, dass die angebotenen Artikel und Informationen auch in Ihrer Einsatzumgebung die erwünschten Ergebnisse erzielen. Die Entscheidung darüber, ob und in welcher Form Sie die angebotenen Artikel und Informationen nutzen, liegt daher allein bei Ihnen. Mit Ausnahme der gesetzlichen Haftung für Vorsatz ist jede Haftung von Microsoft im Zusammenhang mit Ihrer Nutzung dieser Artikel oder Informationen ausgeschlossen.

Ihr Feedback an uns

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com