VS2017非UWP动态DLL项目/ZW编译失败原因咨询
我来给你拆解一下这个问题的核心原因,毕竟我也碰过类似的坑:
VS2017工具链的收紧限制
微软在VS2017版本里调整了C++/CX的支持范围,默认情况下/ZW编译选项只对UWP项目(包括UWP DLL、EXE)开放。早期的VS2013/2015可能允许非UWP项目开启这个选项,但VS2017开始把C++/CX的支持和UWP平台的构建系统做了强绑定,非UWP项目的工具链里根本没包含C++/CX所需的完整依赖库和头文件路径,自然编译不过。C++/CX对WinRT的强依赖
C++/CX本质是基于Windows Runtime(WinRT)的语法扩展,而非UWP项目默认用的是传统Win32 SDK。C++/CX需要的WinRT相关头文件(比如collection.h、WinRT版的windows.h子集)在非UWP项目的默认包含路径里要么缺失,要么版本不兼容。就算你手动加了路径,链接阶段还会因为缺runtimeobject.lib这类WinRT专属库失败——非UWP项目的链接器配置根本没默认引入这些库。项目配置的隐性差异
UWP项目默认会设置_WINRT_DLL、WINAPI_FAMILY=WINAPI_FAMILY_APP这类宏,还会在链接输入里加windowsapp.lib等专属库,但非UWP项目的模板完全没这些配置。就算你手动硬加这些参数,VS2017的项目系统还会做校验,检查项目类型和/ZW选项是否匹配,大概率还是会拦下来。微软的官方策略转向
从VS2017开始,微软更推C++/WinRT替代C++/CX作为WinRT开发方式,C++/WinRT对非UWP项目的支持友好得多,而C++/CX逐渐被定位成UWP专属的语法扩展。所以VS2017在工具链上直接弱化甚至阻止了非UWP项目用C++/CX的可能。
内容的提问来源于stack exchange,提问作者eric frazer

