Sdílet prostřednictvím


Chyba linkerů LNK2022

Operace metadat selhala (HRESULT): error_message

Linker zjistil chybu při slučování metadat. Chyby metadat musí být vyřešeny, aby bylo možné úspěšně propojit.

Jedním ze způsobů, jak tento problém diagnostikovat, je spuštění ildasm -tokens v souborech objektů, abyste zjistili, které typy mají tokeny uvedené v error_messagea vyhledejte rozdíly. V metadatech nejsou platné dva různé typy se stejným názvem, i když se liší pouze atribut LayoutType.

Jedním z důvodů LNK2022 je situace, kdy typ (například struktura) existuje ve více compilandech se stejným názvem, ale s konfliktními definicemi a při kompilaci pomocí /clr. V tomto případě se ujistěte, že typ má identickou definici ve všech compilands. Název typu je uveden v seznamu error_message.

Další možnou příčinou LNK2022 je, že linker najde soubor metadat v jiném umístění, než byl zadán kompilátoru (s #using ). Ujistěte se, že soubor metadat (.dll nebo .netmodule) je ve stejném umístění při předání do linkeru, jako byl při jeho předání kompilátoru.

Při vytváření aplikace ATL je použití makra _ATL_MIXED vyžadováno ve všech compilands, pokud se používá alespoň v jednom.

Příklady

Následující ukázka definuje prázdný typ.

// LNK2022_a.cpp
// compile with: /clr /c
public ref class Test {};

Tato ukázka ukazuje, že nelze propojit dva soubory zdrojového kódu, které obsahují typy stejného názvu, ale různé definice.

Následující ukázka vygeneruje LNK2022.

// LNK2022_b.cpp
// compile with: LNK2022_a.cpp /clr /LD
// LNK2022 expected
public ref class Test {
   void func() {}
   int var;
};