次の方法で共有


リンカ ツール エラー LNK2022

メタデータの操作に失敗しました (HRESULT) : error_message

リンカーがメタデータのマージ中にエラーを検出しました。 正常にリンクするには、メタデータ エラーを解決する必要があります。

この問題を診断する方法の 1 つは、オブジェクト ファイルで ildasm -tokens を実行して、error_message に一覧表示されているトークンを持つ型を見つけ、違いを探す方法です。 メタデータでは、LayoutType 属性が異なる場合でも、同じ名前の 2 つの異なる型は無効です。

LNK2022 の理由の 1 つは、型 (構造体など) が同じ名前を持つ複数のコンパイルに存在するが、定義が競合している場合や、/clr を使用してコンパイルする場合です。 この場合は、すべてのコンパイルで型に同じ定義があることを確認します。 型名は error_message に一覧表示されます。

LNK2022 のもう 1 つの考えられる原因は、リンカーがメタデータ ・ファイルをコンパイラに指定された場所と異なる場所に見つけた場合です (#usingで指定します)。 メタデータ ファイル (.dll または .netmodule) が、コンパイラに渡されたときと同じまま、リンカーに渡されたときと同じ場所に格納されている必要があります。

ATL アプリケーションをビルドする際、少なくとも 1 つのコンパイルでマクロ _ATL_MIXED が使用されていれば、すべてのコンパイルでその使用が要求されます。

次の例では、空の型を定義します。

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

このサンプルは、同じ名前で定義が異なる型を含む 2 つのソース コード ファイルをリンクできないことを示しています。

次の例では LNK2022 が生成されます。

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