LNK2022 di Errore Quando si Utilizza /clr

Sto avendo un problema di collegamento di un progetto C++ in VS2008 quando si utilizza il /clr opzione di compilazione. Ricevo i seguenti errori di costruzione:

Class1.obj : error LNK2022: metadata operation failed (8013118D) : Inconsistent layout information in duplicated types (_PROPSHEETPAGEA): (0x0200046f).
Class1.obj : error LNK2022: metadata operation failed (8013118D) : Inconsistent layout information in duplicated types (_PROPSHEETPAGEW): (0x02000473).
Class2.obj : error LNK2022: metadata operation failed (8013118D) : Inconsistent layout information in duplicated types (_PROPSHEETPAGEA): (0x0200046f).
Class2.obj : error LNK2022: metadata operation failed (8013118D) : Inconsistent layout information in duplicated types (_PROPSHEETPAGEW): (0x02000473).
Class3.obj : error LNK2022: metadata operation failed (8013118D) : Inconsistent layout information in duplicated types (_PROPSHEETPAGEA): (0x0200046e).
Class3.obj : error LNK2022: metadata operation failed (8013118D) : Inconsistent layout information in duplicated types (_PROPSHEETPAGEW): (0x02000472).
Class4.obj : error LNK2022: metadata operation failed (8013118D) : Inconsistent layout information in duplicated types (_PROPSHEETPAGEA): (0x0200046e).
Class4.obj : error LNK2022: metadata operation failed (8013118D) : Inconsistent layout information in duplicated types (_PROPSHEETPAGEW): (0x02000472).
Class5.obj : error LNK2022: metadata operation failed (8013118D) : Inconsistent layout information in duplicated types (_PROPSHEETPAGEA): (0x0200046e).
Class5.obj : error LNK2022: metadata operation failed (8013118D) : Inconsistent layout information in duplicated types (_PROPSHEETPAGEW): (0x02000472).
Class6.obj : error LNK2022: metadata operation failed (8013118D) : Inconsistent layout information in duplicated types (_PROPSHEETPAGEA): (0x0200046e).
Class6.obj : error LNK2022: metadata operation failed (8013118D) : Inconsistent layout information in duplicated types (_PROPSHEETPAGEW): (0x02000472).
LINK : fatal error LNK1255: link failed because of metadata errors

Non ho idea di cosa PROPSHEETPAGEA e PROPSHEETPAGEW riferimento. Ho controllato on-line per vedere Microsoft descrizione dell’errore, ma sono in perdita quanto a che cosa significa.
http://support.microsoft.com/kb/324088

Per risolvere questo problema, aggiungere gli identificatori univoci, quando si utilizzano le Estensioni Gestite per C++ in modo da evitare di utilizzo anonime strutture come variabili globali.

Microsoft ha confermato che questo un bug nei prodotti Microsoft elencati all’inizio di questo articolo. Questo bug è stato corretto in Microsoft Visual C++ .NET (2003).

Tutte le idee sarebbe molto apprezzato.

MODIFICA

Dopo aver fatto un ildasm su Class1.obj ho estratto due messaggi:

//TypeDef #1134 (0200046f)
//-------------------------------------------------------
// TypDefName: _PROPSHEETPAGEA  (0200046F)
// Flags     : [NotPublic] [SequentialLayout] [Class] [Sealed] [AnsiClass] [BeforeFieldInit]  (00100108)
// Extends   : 0100000B [TypeRef] System.ValueType
// Layout    : Packing:0, Size:56
// CustomAttribute #1 (0c0012a0)
// -------------------------------------------------------
//     CustomAttribute Type: 0a000003
//     CustomAttributeName: Microsoft.VisualC.MiscellaneousBitsAttribute :: instance void .ctor(int32)
//     Length: 8
//     Value : 01 00 41 00 00 00 00 00                          >  A             <
//     ctor args: (65)
//
// CustomAttribute #2 (0c0012a1)
// -------------------------------------------------------
//     CustomAttribute Type: 0a000001
//     CustomAttributeName: Microsoft.VisualC.DebugInfoInPDBAttribute :: instance void .ctor()
//     Length: 4
//     Value : 01 00 00 00                                      >                <
//     ctor args: ()
//
// CustomAttribute #3 (0c0012a2)
// -------------------------------------------------------
//     CustomAttribute Type: 0a000004
//     CustomAttributeName: System.Runtime.CompilerServices.NativeCppClassAttribute :: instance void .ctor()
//     Length: 4
//     Value : 01 00 00 00                                      >                <
//     ctor args: ()


//TypeDef #1138 (02000473)
//-------------------------------------------------------
// TypDefName: _PROPSHEETPAGEW  (02000473)
// Flags     : [NotPublic] [SequentialLayout] [Class] [Sealed] [AnsiClass] [BeforeFieldInit]  (00100108)
// Extends   : 0100000B [TypeRef] System.ValueType
// Layout    : Packing:0, Size:56
// CustomAttribute #1 (0c0012b0)
// -------------------------------------------------------
//     CustomAttribute Type: 0a000004
//     CustomAttributeName: System.Runtime.CompilerServices.NativeCppClassAttribute :: instance void .ctor()
//     Length: 4
//     Value : 01 00 00 00                                      >                <
//     ctor args: ()
//
// CustomAttribute #2 (0c0012b1)
// -------------------------------------------------------
//     CustomAttribute Type: 0a000001
//     CustomAttributeName: Microsoft.VisualC.DebugInfoInPDBAttribute :: instance void .ctor()
//     Length: 4
//     Value : 01 00 00 00                                      >                <
//     ctor args: ()
//
// CustomAttribute #3 (0c0012b2)
// -------------------------------------------------------
//     CustomAttribute Type: 0a000003
//     CustomAttributeName: Microsoft.VisualC.MiscellaneousBitsAttribute :: instance void .ctor(int32)
//     Length: 8
//     Value : 01 00 41 00 00 00 00 00                          >  A             <
//     ctor args: (65)

Io non sono sicuro di cosa significhi tutto ciò, ma sembra come se la seconda voce è identica alla prima, con l’eccezione degli attributi definiti all’indietro.

  • Ho modificato la mia soluzione per casa tutto il codice gestito in un unico progetto, invece di più progetti, e l’errore è scomparso. Sarà sempre un mistero…
InformationsquelleAutor lumberjack4 | 2010-10-11



9 Replies
  1. 4

    Ho avuto questo stesso problema, oggi, su uno dei miei progetti.
    Ho risolto da riorganizzare i miei file di intestazione. Problema era che avevo spostato un file di intestazione per la parte superiore del file cpp, prima che il file che è stato incluso windows.h.
    Così, una volta che ho ripristinato l’ordine di inclusione, e mettere windows.h indietro nella parte superiore del file cpp, è tutto risolto.

    molto strano correzione, ma non ha funzionato per me.

  2. 5

    Ho risolto il problema semplicemente facendo una “pulizia” generale del solutuion. Sembra che questo può accadere se VS mescola le cose.

  3. 1

    Sembra che tu stia facendo qualcosa di simile a questo:

    struct
    {
        int a;
        int b;
    } global_struct;

    che è anonimo. Se si cambia a:

    struct UniqueNameHere
    {
        int a;
        int b;
    } global_struct;

    che dovrebbe correggere gli errori.

    • Non vedo questo scenario pop-up ovunque nel mio codice.
    • PROPSHEETPAGEA e PROPSHEETPAGEW sono Windows strutture. Mi sembra che l’intestazione in cui queste strutture sono definite (prsht.h) non si comportano bene in CLR-progetti. C’è una possibilità che questa intestazione viene incluso quando non ha bisogno di essere? Si potrebbe riorganizzare il codice per escludere le intestazioni non sono necessari per il progetto all’interno della soluzione.
  4. 1

    Ho avuto lo stesso problema oggi, la migrazione del mio progetto per vs2008 per vs2010. Durante la compilazione di un CLI progetto che collega con altri C++ librerie, ho ottenuto questo errore di collegamento su:

    MSVCMRTD.lib(locale0_implib.obj) : error LNK2022: metadata operation failed (8013118D) : Inconsistent layout information in duplicated types (std.basic_string<char,std::char_traits<char>,std::allocator<char> >): (0x0200004f).
    MSVCMRTD.lib(locale0_implib.obj) : error LNK2022: metadata operation failed (8013118D) : Inconsistent layout information in duplicated types (std.basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t> >): (0x02000075).

    Ho provato ildasm la documentazione suggeriscono, ma non riusciva a trovare qualsiasi tipo di definizioni che pare la stessa cosa ma con nomi diversi.

    inoltre, devo dire di non capire completamente questo errore. Il fatto che due errori vengono visualizzati significa che ci sono due diversi tipi di problemi con entrambi i tipi (char stringa e wchar stringa) o significa che c’è un problema che questi due tipi sono la causa. Qual è il significato dei numeri, alla fine della linea (ho trovato due typedef sul ildasm registro con questi numeri, però). Non c’è nulla di che nella documentazione.

    BTW – progetti -stessa configurazione si compila e si collega perfettamente con vs2008.

    Comunque, perso nel buio, ho girato il mio C++ lib, che si collegano con il CLI progetto, in un CLI progetto (compilazione con /clr bandiera). ricollegando le principali CLI progetto sembra risolvere il problema. In qualche modo, aggiungendo il supporto clr o di collegamento con clr risolvere questo tipi di collisione.

    Se qualcuno ha un educato spiegazione a questo problema, mi piacerebbe leggerlo.

  5. 1

    Stavo affrontando lo stesso tipo di problema, ma poi ho trovato che la classe che è stato mostrato l’errore è stato ripetuto due volte. Io avevo memorizzato la mia classe principale file di intestazione nella mia directory di progetto per scopi di backup, e l’originale è residente nella cartella del mio progetto. E ‘ successo perché avevo inserito questi due percorsi di directory nel mio progetto “Includono l’Aggiunta di File Path” di proprietà.

  6. 0
    MSVCMRTD.lib(locale0_implib.obj) : error LNK2022: metadata operation failed (8013118D) : Inconsistent layout information in duplicated types (std.basic_string<char,std::char_traits<char>,std::allocator<char> >): (0x0200004f).
    MSVCMRTD.lib(locale0_implib.obj) : error LNK2022: metadata operation failed (8013118D) : Inconsistent layout information in duplicated types (std.basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t> >): (0x02000075).

    Questo errore viene visualizzato solo nella versione di debug, è una sorta di bug del compilatore. Per risolvere il problema è possibile cambiare l’impostazione del progetto

    Configuration Properties\C/C++\Code Generation\Runtime Library

    da

    MultiThreaded Debug Dll (MDD)

    per MultiThreaded Dll (MD) (per DLL). Ma poi avrai problemi con il debug di questo codice (ad esempio, con punti di interruzione)

    Un altro modo è quello di sbarazzarsi di stl classi miste, codice: completamente in progetto o in parte: a dividere il progetto in puro nativo (con classi Stl) e misto parti, creare diverse intestazioni precompilate per loro, interruttore off /clr per l’intero progetto, e accenderlo solo per il cpp con codice misto.

  7. 0

    Nel mio caso una dichiarazione di classe era dipendente da alcuni #define dichiarato in una .h (test #ifdef)che ho dimenticato di includere in uno dei file che si utilizza. Nel risultato linker avuto 2 diverse descrizioni della classe.
    In questa situazione, controllare tutti i file che includono i relativi file con la condizionale dichiarazione.

  8. 0

    In uno dei progetti dipendenti stdafx.h non contiene la seguente dichiarazione:

    #ifndef WINVER          //Allow use of features specific to Windows XP or later.
    #define WINVER 0x0501   //Change this to the appropriate value to target other versions of Windows.
    #endif

    Il risultato è diverso compilazione file prsht.h nei vari progetti.

    In questo nome di file è dichiarato struttura con _PROPSHEETPAGE.

    VS 2008

  9. -1

    Anch’io ho avuto questo problema di recente. Sembra che prima ho fatto un mio lavoro forma, avevo fatto un’altra forma, ma eliminato. Ma in qualche modo uno dei suoi .file cpp è rimasto. Fino al momento che l’ho notato, ho avuto questo errore. Una volta che ho rimosso .cpp file eliminati forma, il prblem è andato via.

Lascia un commento