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

13

我正在使用以下工具/版本进行编程:Windows 10 / VS2017 Professional / C++。

在升级到15.5.1版本后,我遇到了以下错误:

MIDL2338:开关相互矛盾 - no_robust vs.-target

Microsoft编译器错误描述列表显示:当您编译IDL文件时,不能同时使用/osf和/ms_ext命令行开关。

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

我尝试降级回到15.4.1版本,但发现除非是 N-1 版本,否则无法还原旧版本。这是基于我阅读过的许多博客(包括Stack Overflow)所得出的结论。

我已经遇到了问题,目前停滞不前,直到解决这个开关问题。

非常感谢您的帮助。


你有检查过项目属性页面 | 链接器 | 嵌入式 IDL 吗?此外,文档中是否有任何有用的信息 /ms_ext/osf - Chris O
我已经检查了嵌入式IDL设置。没有指定开关。此外,它在VS2017 v15.4.1下成功构建。我对/ms_ext和/osf开关进行了大量研究,并对可能由于升级而需要进行的修改进行了调整。 - trishm
2个回答

14

我刚刚遇到了同样的问题,但幸运的是我有另一个更旧的安装程序可以使用。

以下是在VS 2017 15.4.4下的命令行:

/iid "RtdHandleServer_i.c" /env win32 /h "RtdHandleServer.h" /W1 /char signed /tlb "Win32\Release\RtdHandleServer.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 "Win32\Release\RtdHandleServer.tlb" /Oicf /target "NT60" /D "NDEBUG" /no_robust /nologo /proxy "RtdHandleServer_p.c" 

所做的唯一更改是添加了一个新参数/target "NT60",可能作为新默认值。
在idl文件的属性页面对话框中,进入配置属性>MIDL>高级,并清除“最小目标系统”的值。
去掉-no_robust标志。根据文档(https://msdn.microsoft.com/en-us/library/windows/desktop/aa367349%28v=vs.85%29.aspx?f=255&MSPPError=-2147217396):
“如果生成的存根需要在Microsoft Windows NT、Windows 95/98或Windows Me上运行,则必须使用/no_robust命令行开关来禁用/robust功能。”
任何一种方法都适用于我消除错误,但第一种方法影响最小。
PS. 我认为此处 MS 错误描述 (https://msdn.microsoft.com/en-us/library/windows/desktop/aa366756%28v=vs.85%29.aspx?f=255&MSPPError=-2147217396) 可能不正确。你看到的原始错误信息指的是两个特定标志,/no_robust/target,而不是 /osf/ms_ext
注:MIDL 编译器 /robust 开关执行以下操作 (Microsoft docs MIDL compiler: /robust switch)

使用 /robust 开关会生成附加信息,允许网络数据表示 (NDR) 引擎在动态数组、联合和 DCOM 应用程序中的出接口指针中对相关参数进行运行时错误检查。/robust 开关仅适用于 Windows 2000 和更高版本的 Windows。


如果您有多个带有IDL文件的项目,则最好的选择是创建一个PropertySheet或使用现有的PropertySheet。仅设置所需的/robust和/target,并将属性表分配给每个项目。您还需要确保/robust和/target设置为“从父级或项目默认值继承”。 - blit
bb292,感谢您的回复。我尝试了这两个更改,但是仍然出现了相同的错误。 - trishm
/iid "AceRmServer_i.c" /env win32 /h "AceRmServer_h.h" /W1 /char signed /tlb "Debug\BtiRmAgent.tlb" /D "_DEBUG" /nologo - trishm
bb292: 成功了!!在我的第一次尝试中,我删除了NT60和no_robust设置。这次我只删除了NT60。谢谢,谢谢,谢谢! - trishm

1
为了去除/no_robust标志(如果生成的存根不需要在Microsoft Windows NT、Windows 95/98或Windows Me上运行),只需删除即可。
<ValidateAllParameters>false</ValidateAllParameters>

.vcxproj 文件中,<Midl> 元素下的条目。
来源:ref

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接