将VS2017从15.4.1升级到15.5.1导致构建错误

Upgrading VS2017 from 15.4.1 to 15.5.1 resulted in build error

本文关键字:构建 错误 VS2017 1升      更新时间:2023-10-16

我正在使用以下工具/版本进行编程:Windows 10/vs2017 Professional/c

升级到15.5.1后,我收到以下错误:

MIDL2338:开关是矛盾的-NO_ROBUST vs. -TARGET

Microsoft编译器错误描述列表说:编译IDL文件时,您不能同时使用/OSF和/MS_EXT命令行交换。

我的项目属性中没有指定这些开关。

我试图降级至15.4.1,但发现除非是N-1,否则不可能还原为旧版本。这是基于我阅读的许多博客(包括堆栈溢出)。

我已经撞墙了,直到我弄清楚这个开关问题。

您的帮助将不胜感激。

我刚刚遇到了同一问题,但是幸运的是,我确实可以访问另一个较旧的安装。

这是VS 2017下的命令行15.4.4:

/iid "RtdHandleServer_i.c" /env win32 /h "RtdHandleServer.h" /W1 /char signed /tlb "Win32ReleaseRtdHandleServer.tlb" /Oicf /D "NDEBUG" /no_robust /nologo /proxy "RtdHandleServer_p.c" 

这是在VS 2017下更改为15.5.1:

/iid "RtdHandleServer_i.c" /env win32 /h "RtdHandleServer.h" /W1 /char signed /tlb "Win32ReleaseRtdHandleServer.tlb" /Oicf /target "NT60" /D "NDEBUG" /no_robust /nologo /proxy "RtdHandleServer_p.c" 

因此,所有已更改的都是新参数/target" nt60" 已被添加为新的默认值。

我看上去好像有两种解决方案:

  1. 在IDL文件的属性页面对话框中,转到配置属性>Midl>高级,并清除"最低目标系统"的价值。
  2. 摆脱-no_robust标志。根据文档(https://msdn.microsoft.com/en-us/library/windows/windows/aa367349(v=vs.85).aspx?f=255&ampperror = -2147217396)>

;如果生成的存根需要在Microsoft Windows NT,Windows 95/98或Windows ME上运行,则必须使用/no_robust命令行开关禁用/可靠功能。

在摆脱错误方面,更改对我有用,但是第一种方法的影响最小。

ps。我认为MS错误描述(https://msdn.microsoft.com/en-us/library/windows/desktop/aa366756(v=vs.85)9.aspx?f=2555& mmspperror = -2147217396)在这种情况下,可能是不正确的。您看到的原始错误消息是指两个特定标志/no_robust /target ,而不是/osf /ms_ext

注意: MIDL编译器/robust开关执行以下操作(Microsoft Docs Midl Compiler:/robust Switch)

使用/robust开关生成允许的其他信息网络数据表示(NDR)引擎以执行运行时错误检查动态阵列,工会和外部的相关论点DCOM应用中的接口指针。/健壮的开关仅为在Windows 2000和更高版本的Windows下可用。

为了删除/no_robust标志(如果生成的存根不需要在Microsoft Windows NT,Windows 95/98或Windows ME上运行),只需删除

<ValidateAllParameters>false</ValidateAllParameters>

.vcxproj文件中的<Midl>元素下的条目。

来源:ref