Sie sind zurzeit offline. Es wird auf die erneute Herstellung einer Internetverbindung gewartet.

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

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++
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.
nafxcwd
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.
Eigenschaften

Artikelnummer: 148652 – Letzte Überarbeitung: 02/10/2006 13:05:00 – Revision: 6.1

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

  • kberrmsg kbtshoot kbprb kbarttypeinf KB148652
Feedback
ml>