LNK2022(复制管理的类型有不同的可见性)上MSVS 2012(LNK2022 (Duplica

2019-08-01 00:36发布

我移植从MSVS2005到MSVS2012的解决方案。 该项目是在C ++ .NET,但使用自制的本地C ++ libraires了。 我们有没有问题,建设项目,2005年,但现在,我无法建立使用2012年我收到以下错误消息的项目:

MyFile.obj:错误LNK2022:元数据操作失败(801311E4):重复管理的类型有不同的可见性。

这是什么意思? 你需要什么信息来帮助我?

谢谢你的帮助?

Answer 1:

我发现的bug。 这是一个已经在这里提出的一切的混合。

某处在该项目中,原生C ++头文件包含。 在这个文件中的类是由公众:

#include "File_Where_ClassName_Is_Defined.h"
#pragma make_public( ClassName )

但在我自己的代码,包括我自身包括在公开类定义的头第二集。 所以,在这一点上,这个类在一个文件中“公开”,并在同一个项目中的另一个文件“ 公开”。 “有不同的可见性重复”来自那里。

那差我在错误的道路上只有一点是错误消息:“重复管理的类型有不同的可见性”。 但在这里,它是一个非托管类型。

所以,如果你遇到这个错误有一天,看在项目的#pragma make_public(...),然后查找重复的包含在你的问题的文件。



Answer 2:

我有同样的问题,而且确实曾在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


Answer 3:

微软修复修复此问题: KB2848798 。

它帮助我迁移VS2010解决VS2012。

您可以下载它在这里

从上面的补丁程序链接相关的细节:CLR问题1

症状

当您从Microsoft Visual Studio 2010中升级到Visual Studio 2012年,一些C ++ / CLI项目无法建设,而且他们报告类似于以下的链接器错误:

MSVCMRTD.lib(mstart.obj):错误LNK2022:元数据操作失败(801311E4)



Answer 4:

有同样的问题,从升级到VS2008 VS2012。 另一种解决方案来修补程序对我来说是移动的

#pragma make_public( ClassName )

从.cpp文件的地方是到现在为止到stdafx.h中声明。



Answer 5:

我不得不尝试编译VC ++ 2013 Win2008R2机器上项目(编译于Win8.1精绝)了同样的问题。 仅仅取消任何重复的#include没有解决这个问题对我来说。

然而,我再启用预编译的头和移动所有 make_public()该项目的报表stdafx.h中,并终于做到了!



文章来源: LNK2022 (Duplicate managed types have different visibilities) on MSVS 2012