链接器工具错误 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;
};