Dojde k chybě LNK2005 CRT knihovny a knihovny MFC, které jsou propojeny v nesprávném pořadí v aplikaci Visual C++

Příznaky

Pokud knihovna Run-Time C (CRT) a knihovny Microsoft Foundation Class (MFC) jsou propojeny v nesprávném pořadí, můžete obdržet jednu z následující LNK2005 chyby:
nafxcwd.lib(afxmem.obj): Chyba LNK2005:
"void * nový operátor __cdecl (unsigned int)" (?? 2@YAPAXI@Z) již
podle LIBCMTD.lib(new.obj)
nafxcwd.lib(afxmem.obj): Chyba LNK2005:
"zrušit __cdecl operátor delete(void *)" (?? 3@YAXPAX@Z) již definovány.
v LIBCMTD.lib(dbgnew.obj)
nafxcwd.lib(afxmem.obj): Chyba LNK2005:
"void * __cdecl operátor nové (unsigned int, int, char const *, int)"
(?? 2@YAPAXIHPBDH@Z) již definované v LIBCMTD.lib(dbgnew.obj)
mfcs40d.lib(dllmodul.obj): Chyba LNK2005: již definované v _DllMain@12
MSVCRTD.LIB (dllmain.obj)
mfcs42d.lib(dllmodul.obj): Chyba LNK2005: již definované v _DllMain@12
msvcrtd.lib(dllmain.obj)

Příčina

Knihovny CRT používají slabé externí propojení pro new, deletea funkce DllMain . Knihovny MFC také obsahují nové, Odstranit a funkce DllMain . Tyto funkce vyžadují knihovny MFC propojení před knihovně CRT je spojen.

Řešení

Tento problém lze vyřešit dvěma způsoby. První řešení zahrnuje vynucení linker do knihovny ve správném pořadí propojení. Druhé řešení umožňuje najít modul, který je příčinou problému a opravte jej.

Poznámka: Následující kroky jsou založeny na Visual C++ 6.0.

Řešení 1: Vynucení Linker do knihovny ve správném pořadí

  1. V nabídce projektklepněte na tlačítko Nastavení.
  2. V Nastavení pro zobrazení
    Nastavení projektu dialogové okno, klepnutím vyberte konfigurace projektu, který je získání chyby propojení.
  3. Na kartě odkaz klepněte v seznamu kategorie vyberte vstup.
  4. V seznamu knihoven ignorovat vložte názvy knihoven (například Nafxcwd.lib; Libcmtd.lib).

    Poznámka: Ekvivalent příkazového řádku propojovacího programu v /NOD:< název knihovny >.
  5. V Knihovna objektů/moduly pole vložte názvy knihoven. Ujistěte se, že jsou uvedeny v pořadí a jako první dvě knihovny v řádku (například Nafxcwd.lib Libcmtd.lib).
Chcete-li nastavit tuto možnost v aplikaci Visual C++ .NET, naleznete v tématu nápovědy online "Nastavení Visual C++ Project Properties".

Řešení 2: Vyhledejte a opravte problém modulu

Chcete-li zobrazit aktuální pořadí propojení knihovny, postupujte takto:
  1. V nabídce projektklepněte na tlačítko Nastavení.
  2. V Nastavení pro zobrazení
    Nastavení projektu dialogové okno, klepnutím vyberte konfigurace projektu, který je získání chyby propojení.
  3. Na kartě odkaz zadejte
    / verbose: lib v poli Možnosti projektu.
  4. Znovu vytvořte projekt. Knihovny se zobrazí v okně Výstup během procesu propojování.

Stav

Toto chování je záměrné.

Další informace

Při použití knihovny MFC, musíte zkontrolovat propojeny před knihovně CRT je spojen. Provedete to tak, že každý soubor ve vašem projektu, nejprve zahrnovat Msdev\Mfc\Include\Afx.h buď přímo (#include < Afx.h >) nebo nepřímo (#include < Stdafx.h >). Afx.h zahrnout soubor sil správné pořadí knihoven, pomocí direktivy #pragma comment (lib, "< libname >").


Pokud zdrojový soubor má příponu .c nebo soubor s příponou cpp, ale nepoužívá knihovnu MFC, můžete vytvořit a zahrnout soubor záhlaví malé (Forcelib.h) v horní části modulu. Toto nové záhlaví zajistíte správnost pořadí hledání thelibrary.

Visual C++ neobsahuje soubor záhlaví. Chcete-li vytvořit tento soubor, postupujte takto:
  1. Otevřete Msdev\Mfc\Include\Afx.h.
  2. Vyberte řádky mezi #ifndef _AFX_NOFORCE_LIBS a #endif / /! _AFX_NOFORCE_LIBS.
  3. Kopírovat výběr do schránky systému Windows.
  4. Vytvořte nový textový soubor.
  5. Vložte obsah schránky do nového souboru.
  6. Uložte soubor jako Msdev\Mfc\Include\Forcelib.h.

Kroky pro reprodukci problému v aplikaci Visual C++ .NET

  1. Spusťte aplikaci Visual Studio .NET.
  2. V nabídce soubor přejděte na příkaz
    Novýa potom klikněte na projekt.
  3. Klepněte na položku Projekty Visual C++ ve skupinovém rámečku
    Typy projektůa v části šablonyklepněte na příkaz Aplikace MFC.
  4. Do textového pole název zadejte
    Q148652.
  5. Do pole umístění zadejte
    C:\Testa potom klepněte na tlačítko OK.
  6. V dialogovém okně Průvodce aplikací knihovny MFC klepněte na Typ aplikace.
  7. Klepněte na možnost Dialog based pod
    Typ aplikacea potom klepněte na tlačítko Použít knihovnu MFC ve statické knihovně za Použití knihovny MFC.
  8. Klepněte na tlačítko Dokončit.
  9. Ve skupinovém rámečku Zdrojové souboryv Průzkumníku řešení vyberte všechny tři soubory CPP.
  10. Klepněte pravým tlačítkem myši na tři vybrané soubory a potom klepněte na tlačítko
    Odebrat.
  11. Klepněte pravým tlačítkem myši zdrojové soubory, přejděte na
    Přidata potom klepněte na tlačítko Přidat novou položku.
  12. Klepněte na tlačítko soubory C++ ve skupinovém rámečku
    Šablony. Do textového pole název zadejte
    Aa. Klepněte na tlačítko Otevřít.
  13. Vložte následující kód v souboru Aa.cpp:
    int test(){new int; return 1;}
  14. Klepněte pravým tlačítkem myši Zdrojové soubory, přejděte na
    Přidata potom klepněte na tlačítko Přidat existující položku.
  15. Vyberte následující soubory:
    • Q148652.cpp
    • Q148652Dlg.cpp
    • stdafx.cpp
  16. Klepněte na tlačítko Otevřít.
  17. Ve skupinovém rámečku se zobrazí soubory, které jste vybrali v kroku 15
    Zdrojové soubory.
  18. Vyberte všechny čtyři soubory CPP pod Zdrojové soubory.
  19. Čtyři soubory CPP, které jste vybrali klepněte pravým tlačítkem myši a potom klepněte na příkaz Vlastnosti.
  20. Rozbalte Vlastnosti konfiguracea potom rozbalte C/C++.
  21. Klepněte Předkompilované hlavičky.
  22. Nastavte Vytvoření/použití předkompilovaných hlavičekvlastnost Není použití předkompilování záhlaví. Klepněte na tlačítko
    OK.
  23. V nabídce sestavení klikněte na tlačítko Znovu sestavit řešení.
Vlastnosti

ID článku: 148652 - Poslední kontrola: 10. 1. 2017 - Revize: 1

Váš názor