C++ 编译器错误 MDM2009 发现重复类型处理引用另一个库的 2 个 Windows 组件库的元数据文件

Posted

技术标签:

【中文标题】C++ 编译器错误 MDM2009 发现重复类型处理引用另一个库的 2 个 Windows 组件库的元数据文件【英文标题】:C++ compiler error MDM2009 Duplicate type found processing metadata file referencing 2 Windows Component Libraries that both reference another library 【发布时间】:2021-12-23 13:56:16 【问题描述】:

我的解决方案结构如下:

编译器抱怨它在 WCL1.winmd b/c 中发现(每个公共接口/类的)重复类型,该 winmd 文件已存在于 WCL4 的 bin 目录中。

一个问题是我对 C++ 完全一无所知,question 的答案中提供的链接提供了一个没有帮助的 C++ 解决方法(它实际上就像阅读一种不同但相关的语言——即阅读我只会英语的时候是德语)。

我还找到了this,它提供了另一种解决方法,但没有告诉您将它放在哪里。我将指定的 ItemGroupDescription 元素添加到每个 .csproj 文件以及应用程序的 PropertySheet.props 文件中均无济于事。

我还做了以下事情:

将代码从 WCL2 移到 WCL3 并从 解决方案。 有应用程序引用 WCL1、WCL3 和 WCL4。

其他人有什么想法吗?将不胜感激......

更新:

这里有一个link 用于重现编译错误的小型解决方案。 它似乎来自 C++ 应用程序引用的Microsoft.Windows.CppWinRT NuGet 包。该包从应用程序引用的组件项目生成的 .winmd 文件中自动生成 C++ 头文件。

【问题讨论】:

您是否有一小部分文件可供我们查看? @SimonMourier - 今天早上我会花一些时间来创建它。谢谢。 @SimonMourier - 我会创建一些东西,但我想我会补充一点,在我在应用程序中添加对 Microsoft.Windows.CppWinRT NuGet 包的引用之前,一切都可以编译。此包从应用程序引用的 Windows 运行时组件库生成 C++ 头文件。 请详细说明您的操作系统版本和应用的目标和最低版本。 @NicoZhu-MSFT - 操作系统版本为 10.0.22000.0。应用程序的最小目标是 10.0.17134.0。每个组件项目的最低目标是此处推荐的 Creators Update(Build 15063)(尽管该版本已停止支持 2 年):docs.microsoft.com/en-us/windows/uwp/cpp-and-winrt-apis/… 【参考方案1】:

嗯....它并不完美,但这就是我解决问题的方法...将以下行添加到每个 Component .csproj 文件中的每个 ProjectReference 中:

我不确定这个特定 Xml 元素的意图是什么,但是通过设置 Private=false,编译器不会将 InterfaceDefinitionComponent.winmd 文件复制到其他组件的 bin 目录中,这会阻止 C++ 编译器看到重复 .winmd 文件并炸毁,因为它试图为同一类型生成多个相同的 C++ 头文件。

【讨论】:

以上是关于C++ 编译器错误 MDM2009 发现重复类型处理引用另一个库的 2 个 Windows 组件库的元数据文件的主要内容,如果未能解决你的问题,请参考以下文章

奇怪的 C++ 模板问题

Visual 2015 C++ 编译器:使用对象调用静态成员不会导致编译器错误 [重复]

编译类型向量类的私有成员时出错 - C++ [重复]

无法使用 gcc 在 Linux 中编译任何 c++ 程序,出现一些奇怪的错误 [重复]

C++ 静态结构类型成员初始化

C++ Visual Studio 编译错误