VS2017编译旧VS6 C++项目遇windows.winmd缺失及报错求助
解决VS2017迁移老VS6 C++项目时的windows.winmd相关编译问题
这种从VS6跨到VS2017的老项目迁移,尤其是针对Windows Embedded的场景,碰到winmd相关的坑太正常了——毕竟这俩版本的编译体系差了快20年,winmd是WinRT/UWP时代的产物,老Win32/Embedded项目本来根本不需要碰它。结合你的情况,给你一步步排查的思路:
1. 先确认项目是不是被误识别成UWP/WinRT项目了
winmd文件是Windows Runtime组件的元数据文件,只有UWP或者用到WinRT的项目才需要依赖它。你的老VS6项目肯定是传统Win32/Embedded项目,大概率是迁移时VS2017自动给你开了WinRT相关的设置:
- 右键项目 → 属性 → 配置属性 → 常规,看配置类型是不是「应用程序(.exe)」或「动态链接库(.dll)」这类传统Win32类型,而不是「Windows应用程序(UWP)」;
- 再搜一下项目属性里的「启用Windows运行时扩展」:在C/C++ → 所有选项里搜这个选项,如果是「是(/ZW)」,立刻改成「否」——这几乎是这类问题的元凶。
2. 清理手动添加的/AI参数和多余路径
你之前为了解决platform.winmd和windows.winmd的问题加了/AI参数,现在先把这些手动加的路径全删掉:
- 项目属性 → C/C++ → 常规 → 附加WinMD目录,清空这里的内容;
- 同时检查「附加包含目录」和「链接器 → 常规 → 附加库目录」,有没有不小心加了Windows 10 SDK里的WinRT相关路径,一并移除;
- 环境变量LIBPATH里如果有多余的WinRT路径,也暂时去掉(可以在命令行里用
set LIBPATH=临时清空测试,或者通过系统属性修改)。
3. 配置正确的Windows SDK和平台工具集
你的目标是Windows Embedded系统,现在在Win7上用VS2017,必须选对SDK版本和工具集:
- 项目属性 → 常规 → 平台工具集,选「v141」(VS2017默认工具集),如果需要兼容更老的系统可以选「v141_xp」(但你目标是Win7+Embedded,v141足够);
- 同样在常规里的Windows SDK版本,不要选最新的10.0.17134.0,而是选和你的Windows Embedded系统匹配的版本。比如如果是Windows Embedded Standard 7,选「Windows 7.1 SDK」(需要提前安装)或者选兼容的Windows 10 SDK(比如10.0.14393.0,这个版本对Win7支持较好);
- 检查「目标平台版本」:在C/C++ → 所有选项里找到这个设置,确保和你选的SDK版本一致。
4. 处理加winmd路径后出现的100+错误
这些错误几乎都是WinRT头文件和传统Win32头文件冲突导致的——比如WinRT的命名空间和Windows API重名,或者类型定义冲突:
- 先按上面的步骤关掉WinRT扩展、清理多余路径,重新编译,看错误是不是消失;
- 如果还有错误,逐个看错误信息,定位到冲突的文件:比如某个cpp文件里不小心引入了
<winrt/...>这类WinRT头文件,或者项目里有#ifdef启用了WinRT代码,把这些无用的代码注释掉; - 开启兼容模式:VS2017对C标准的严格性比VS6高很多,老项目里的非标准语法可能报错。可以在C/C → 语言里,把「符合模式」设为「否」,「允许Microsoft扩展」设为「是」。
5. 真需要WinRT时的正确姿势(大概率不需要)
如果你的项目确实要调用WinRT组件(老Embedded项目很少见),那要确保:
- 只添加对应目标Embedded系统的winmd路径,不要混用桌面Windows 10的winmd;
- 在/AI参数里添加的路径,要选和你设置的Windows SDK版本完全一致的目录,比如你选了10.0.14393.0的SDK,就加
C:\Program Files (x86)\Windows Kits\10\UnionMetadata\10.0.14393.0; - 确保LIBPATH里只有这个正确的路径,避免编译器找到错误版本的winmd。
最后给个迁移小技巧:先单独编译依赖最少的项目,一个个排查,不要上来就编译整个解决方案——这样更容易定位问题。
内容的提问来源于stack exchange,提问作者Ernesto_Che
相关产品推荐
相关产品推荐

