环境:
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
答案 0 :(得分:37)
我在途中学到的另一件事是{strong>你不能混合Platform Toolset
和Target 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 (或更高),如何定义这些值:
Platform Toolset
- 找到它:项目设置|一般来说,TargetFrameworkVersion
- 卸载项目,右键单击卸载的项目并选择“编辑”。打开'*。* proj'文件后,请修改以下行:<TargetFrameworkVersion>v3.5<TargetFrameworkVersion/>
答案 1 :(得分:1)
_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;