VisualStudio2017\2019\2022版本以上使用VS2017 v141_xp出现问题最完美超终极完美解决方案

xingyun86 2021-12-26 1341

VisualStudio2017\2019\2022版本以上使用VS2017 v141_xp出现问题最完美超终极完美解决方案

当大家各位更换了新版本VS使用,创建支持xp工程的项目时必然会需要更改项目属性为VS2017 v141_xp(当然VS2015 v140_xp也可以,但是还是不如VS2017 v141_xp)。此时编译问题就要出现了:(如果使用了gdiplus库才会出现第2、3条错误)。

1>c:\program files (x86)\microsoft sdks\windows\v7.1a\include\objbase.h(239): error C2760: syntax error: unexpected token 'identifier', expected 'type specifier'
1>c:\program files (x86)\microsoft sdks\windows\v7.1a\include\gdiplusheaders.h(891): error C4596: 'EmfToWmfBits': illegal qualified name in member declaration
1>c:\program files (x86)\microsoft sdks\windows\v7.1a\include\gdiplusstringformat.h(220): error C4596: 'GetTrimming': illegal qualified name in member declaration

好,现在我们开始解决问题。首先Bing、Google发现一些方案,如:

1.将工程配置-》配置属性-》C/C++属性-》语言属性-》加强模式,修改为No(默认是开启Yes。)

微软论坛解决方案:GDI+ StringFormat.h error C4596 when compiling with Visual Studio 2017 Prof. 15.2 (26430.15) Release with C/C++ /permissive- Flag set. (microsoft.com)

stackoverflow解决方案:c++ - How to compile code for Windows XP in Visual Studio 2017 - Stack Overflow

此时再次编译,如果是VS2017\2019时,你会发现错误解决;但当你是VS2022时,你会发现错误依旧。如果你使用的是VS2022,请看下一条解决方案。

2.接下来就是终极的超完美解决方案,首先再卖个关子,我们分析下这三个问题到底是什么原因导致的错误,能不能不关闭加强模式也能解决问题呢?好,接下来我们开始一个个问题的来分析。

第一条问题:objbase.h这个头文件,我们看了之后发现内容东西其实很少,有些宏编译开关和基础定义。所以这个文件引用的东西应该很少,大部分是需要别人引用它的。这个错误意思就是语法错误,不期望的标识符号。所以这里其实很清晰了,就是说IUnknown这个类型还没有声明是什么类型,所以这里使用时编译器不识别。

解决方法:声明一下即可,当然这里还是有些技巧的,因为不排除这个类型是动态的,被限制了就会引发更大的问题。这里正确的修正方法应该是

 typedef struct IUnknown IUnknown;
 static_cast<IUnknown*>(*pp);    // make sure everyone derives from IUnknown

第二条问题:该问题看错误描述会发现和第三条问题一致,所以合并说明即可。错误提示也很清晰,就是说成员声明的时候使用了错误不合规的名称。我们定位文件发现:

gdiplusheaders.h在891行是
Metafile::EmfToWmfBits
修正方法应该是
/*Metafile::*/EmfToWmfBits
同理
gdiplusstringformat.h在220行是
StringFormat::GetTrimming
修正方法应该是
/*StringFormat::*/GetTrimmin

此时你可能会说这个是VS自带的文件哦,这样随意修改不会有问题吗?我的回答是:当然没问题。通过微软官方论坛,已有网友找到了问题并说微软你能不能改一下头文件发布呢,针对这个问题我的观点是:总的来说这两个文件严格意义上不是VS的自身文件,是属于WindowsSDKv71的文件。这个SDK版本已经很老了,所以微软也不太可能去修复这么老旧的版本,更何况如果你使用的还是VS2017以下的话,根本不会有这样的问题。所以各位看官怎么看呢?

×
打赏作者
最新回复 (0)
只看楼主
全部楼主
返回