我移植从MSVS2005到MSVS2012的解决方案。 该项目是在C ++ .NET,但使用自制的本地C ++ libraires了。 我们有没有问题,建设项目,2005年,但现在,我无法建立使用2012年我收到以下错误消息的项目:
MyFile.obj:错误LNK2022:元数据操作失败(801311E4):重复管理的类型有不同的可见性。
这是什么意思? 你需要什么信息来帮助我?
谢谢你的帮助?
我移植从MSVS2005到MSVS2012的解决方案。 该项目是在C ++ .NET,但使用自制的本地C ++ libraires了。 我们有没有问题,建设项目,2005年,但现在,我无法建立使用2012年我收到以下错误消息的项目:
MyFile.obj:错误LNK2022:元数据操作失败(801311E4):重复管理的类型有不同的可见性。
这是什么意思? 你需要什么信息来帮助我?
谢谢你的帮助?
我发现的bug。 这是一个已经在这里提出的一切的混合。
某处在该项目中,原生C ++头文件包含。 在这个文件中的类是由公众:
#include "File_Where_ClassName_Is_Defined.h"
#pragma make_public( ClassName )
但在我自己的代码,包括我自身包括在公开类定义的头第二集。 所以,在这一点上,这个类在一个文件中“公开”,并在同一个项目中的另一个文件“ 不公开”。 “有不同的可见性重复”来自那里。
那差我在错误的道路上只有一点是错误消息:“重复管理的类型有不同的可见性”。 但在这里,它是一个非托管类型。
所以,如果你遇到这个错误有一天,看在项目的#pragma make_public(...),然后查找重复的包含在你的问题的文件。
我有同样的问题,而且确实曾在dom_beau的回答中描述的相同条件,所以我敢肯定我有同样的根本原因也是如此。 但是,为了能够解决的错误,我必须找到实际问题的类(有几个,和错误消息无助于帮助您找到他们!)。
所以我写了下面的LINQ查询发现其在多个* .OBJ文件中定义有冲突的能见度所有类。 这可能是有用的人,所以我在这里张贴。
// Analyze text files produced by ildasm when given *.obj files.
// Use "for %1 in (*.obj) do ildasm /text %1 > %1-ildasm.txt" to produce the files.
from file in Directory.GetFiles(@"your project's intermediate folder")
where file.EndsWith("-ildasm.txt")
let lines = File.ReadAllLines(file)
from i in Enumerable.Range(0, lines.Count() - 1)
where lines[i].Contains("TypDefName:")
let type = lines[i].Substring(16,lines[i].IndexOf(" (")-17)
let flags = lines[i+1]
group new {file, flags} by type into g
where g.Select(t=>t.flags).Distinct().Count() > 1
select g
微软修复修复此问题: KB2848798 。
它帮助我迁移VS2010解决VS2012。
您可以下载它在这里
从上面的补丁程序链接相关的细节:CLR问题1
症状
当您从Microsoft Visual Studio 2010中升级到Visual Studio 2012年,一些C ++ / CLI项目无法建设,而且他们报告类似于以下的链接器错误:
MSVCMRTD.lib(mstart.obj):错误LNK2022:元数据操作失败(801311E4)
有同样的问题,从升级到VS2008 VS2012。 另一种解决方案来修补程序对我来说是移动的
#pragma make_public( ClassName )
从.cpp文件的地方是到现在为止到stdafx.h中声明。
我不得不尝试编译VC ++ 2013 Win2008R2机器上项目(编译于Win8.1精绝)了同样的问题。 仅仅取消任何重复的#include没有解决这个问题对我来说。
然而,我再启用预编译的头和移动所有 make_public()
该项目的报表stdafx.h中,并终于做到了!