链接器工具错误 LNK2022

元数据操作失败 (HRESULT):error_message

链接器在合并元数据时检测到错误。 必须解决元数据错误才能成功链接。

诊断此问题的一种方法是在对象文件上运行 ildasm -tokens,以查找哪些类型在 error_message 中列出了令牌,并找出不同。 在元数据中,具有相同名称的两种不同类型无效,即使只有 LayoutType 属性不同也是如此。

LNK2022 的一个原因是,一个类型(如结构)存在于多个同名但定义冲突的组件中,以及使用 /clr 进行编译。 在这种情况下,请确保该类型在所有编译单位中的定义都相同。 类型名称在 error_message 中列出。

LNK2022 的另一个可能原因是,链接器在与编译器指定的位置不同的位置找到元数据文件(使用 #using)。 确保元数据文件(.dll 或 .netmodule)在传递给链接器时与传递给编译器时位于相同的位置。

构建 ATL 应用程序时,如果至少在一个组件中使用宏 _ATL_MIXED,则所有组件都需要使用该宏。

示例

以下示例定义空类型。

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

此示例显示不能链接两个包含同名类型但定义不同的源代码文件。

下面的示例生成 LNK2022。

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