16

环境: 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
4

3 回答 3

40

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

我发现的可能组合在哪里:

.NET 3.5 或更低版本:

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

.NET 4.0 或更高版本:

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

如何定义这些值:

  1. Platform Toolset– 在以下位置找到它:项目设置 | 一般的,
  2. TargetFrameworkVersion- 卸载项目,右键单击卸载的项目并选择“编辑”。打开“*.*proj”文件后,修改以下行:<TargetFrameworkVersion>v3.5<TargetFrameworkVersion/>
于 2013-09-08T06:52:13.100 回答
2

_WIN32_WINNT=0x0500从 C/C++ 预处理器中删除定义

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

希望这些信息有用。

于 2013-09-03T07:33:05.880 回答
0

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

#define _WIN32_WINNT 0x0501

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

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

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

_WIN32_WINNT=0x0501;
于 2016-05-02T12:05:28.457 回答