C++编译报错MDM2009:引用多Windows组件库时元数据出现重复类型
C++ MDM2009编译错误(重复元数据类型)解决方法
问题说明
开发时遇到C编译错误MDM2009,错误提示为处理元数据文件时发现重复类型,该问题出现在两个存在共同依赖库的Windows组件库引用场景中。
解决方案结构如下:
错误触发原因:编译器检测到WCL1.winmd中所有公共接口、类均存在重复,根因为该winmd文件同时存在于WCL4的bin目录下,Microsoft.Windows.CppWinRT NuGet包会自动从应用引用的组件项目生成的.winmd文件生成C头文件,重复的元数据文件触发了类型检测错误。
此前已尝试的无效方案:
- 将指定的ItemGroupDescription元素添加到所有.csproj文件和应用的PropertySheet.props文件
- 迁移WCL2的代码至WCL3后移除WCL2,调整为应用直接引用WCL1、WCL3、WCL4
解决步骤
方法一:配置CppWinRT排除重复元数据(推荐,无需修改依赖项目)
在C++应用项目的.vcxproj文件,或者项目使用的公共属性表(.props)文件中添加如下配置,明确告知CppWinRT工具链跳过重复的WCL1元数据文件:
<ItemGroup> <!-- 排除WCL4输出目录中的重复WCL1.winmd,可根据实际路径调整,也可使用通配符**\WCL1.winmd匹配所有路径 --> <CppWinRTMetadataInputRemove Include="$(WCL4输出目录的绝对或相对路径)\WCL1.winmd" /> </ItemGroup>
方法二:从根源避免重复元数据生成
如果你可修改WCL4项目的配置,可以在WCL4的.csproj文件中添加如下配置,避免WCL4将依赖的WCL1.winmd复制到自身输出目录:
<PropertyGroup> <!-- 禁止复制依赖项的本地文件到输出目录 --> <CopyLocalLockFileAssemblies>false</CopyLocalLockFileAssemblies> </PropertyGroup> <ItemGroup> <!-- 调整WCL1的引用配置,不将WCL1的输出文件复制到WCL4的输出目录 --> <ProjectReference Include="..\WCL1\WCL1.csproj"> <Private>False</Private> </ProjectReference> </ItemGroup>
最终验证
完成配置后,清理解决方案所有中间缓存与输出文件,执行全量重新构建即可解决MDM2009错误。
内容的提问来源于stack exchange,提问作者jasonxz
相关产品推荐
相关产品推荐

