CLR / CLI链接器失败,错误LNK2022 - 自定义属性不一致

时间:2013-09-02 10:57:00

标签: visual-studio-2010 c++-cli preprocessor clr

环境: Visual Studio 10, CLR/CLI Class Library项目,使用Platform Toolset v100构建,定位框架版本v3.5

我知道这个问题已在这里提出,但我没有找到解决问题的答案,所以再次提出这个问题。

在构建CLR/CLI Class Library (DLL)项目时,链接器失败并出现以下错误:

MSVCMRT.lib(managdeh.obj) : error LNK2022: metadata operation failed (80131195) : Custom attributes are not consistent: (0x0c0000f7).
MSVCMRT.lib(managdeh.obj) : error LNK2022: metadata operation failed (80131195) : Custom attributes are not consistent: (0x0c0000fb).
MSVCMRT.lib(msilexit.obj) : error LNK2022: metadata operation failed (80131195) : Custom attributes are not consistent: (0x0c000128).
MSVCMRT.lib(msilexit.obj) : error LNK2022: metadata operation failed (80131195) : Custom attributes are not consistent: (0x0c00012c).
MSVCMRT.lib(puremsilcode.obj) : error LNK2022: metadata operation failed (80131195) : Custom attributes are not consistent: (0x0c0000ee).
MSVCMRT.lib(puremsilcode.obj) : error LNK2022: metadata operation failed (80131195) : Custom attributes are not consistent: (0x0c0000f1).
LINK : fatal error LNK1255: link failed because of metadata errors

3 个答案:

答案 0 :(得分:37)

我在途中学到的另一件事是{strong>你不能混合Platform ToolsetTarget Framework Version的值。

我找到的可能组合:

.NET 3.5或更低版本:

  • Platform Toolset v90 ,它将使用Visual Studio 2008运行时二进制文件,
  • TargetFrameworkVersion v3.5 (或更少),
  • 在预处理器中,您可以定义_WIN32_WINNT(例如_WIN32_WINNT=0x0500

.NET 4.0或更高版本:

  • Platform Toolset v100 ,它将使用Visual Studio 2010运行时二进制文件,
  • TargetFrameworkVersion v4.0 (或更高),
  • 在预处理器中,您不得定义'_WIN32_WINNT = 0x0500'

如何定义这些值:

  1. Platform Toolset - 找到它:项目设置|一般来说,
  2. TargetFrameworkVersion - 卸载项目,右键单击卸载的项目并选择“编辑”。打开'*。* proj'文件后,请修改以下行:<TargetFrameworkVersion>v3.5<TargetFrameworkVersion/>

答案 1 :(得分:1)

从C / C ++预处理器

中删除_WIN32_WINNT=0x0500定义

显然由于某种原因,上述预处理器定义与链接器不一致,导致链接器错误。我认为这是一些内部的Microsoft bug(?),但不确定。 无论如何,删除这个预处理器定义后,所有内置和链接都正确。

希望这些信息有用。

答案 2 :(得分:0)

我在一些设置Windows版本的编译单元中有一些头文件:

#define _WIN32_WINNT 0x0501

问题在于其他编译单元(c ++文件)没有设置该变量,因此error LNK2022抱怨同一个结构以不同方式编译在多个编译单元(不同的cpp文件)。

所以我不能只取消_WIN32_WINNT定义,所以我的解决方案与之前的建议完全相反。

我只是为整个项目设置它,所以所有的编译单元都以相同的方式编译 项目属性 - &gt; C / C ++ - &gt;预处理器 - &gt;预处理器定义

_WIN32_WINNT=0x0501;