在为XP编译时,VS2017中的GDI +库在VS2017中导致“错误C2760:语法错误:意外的标记'identifier',预期的'type specifier'”

时间:2019-07-12 22:41:01

标签: c++ visual-studio-2017 gdi+

我正在尝试将GDI +的以下定义包含到在Visual Studio 2017下编译的Win32 C ++项目中:

#include <objidl.h>
#include <gdiplus.h>
#pragma comment (lib,"Gdiplus.lib")

我需要编译该项目以支持Windows XP。因此,在项目属性中,我选择:Platform Toolset作为Visual Studio 2017 - Windows XP (v141_xp)

enter image description here

但是当我编译它时,GDI +库给了我这个:

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

有什么解决方法吗?

4 个答案:

答案 0 :(得分:2)

在与COM相关的头文件的第一个(!)#include之前添加此行以修复objbase.h(239): error C2760: syntax error: unexpected token 'identifier', expected 'type specifier'

typedef struct IUnknown IUnknown;

此修复程序有效,因为错误中在objbase.h(239)中的行包含static_cast<IUnknown*>(*pp);,尽管该位置仍未声明IUnknown。

答案 1 :(得分:0)

我可以编译它,但这绝对不是一个好的解决方案。我将其发布为临时解决方法,直到Microsoft摆脱___es的束缚。另外,如果有人找到更好的方法,请告诉我。

为了编译一个写得不好的库,我基本上不得不将整个项目降级到Visual Studio 2015 - Windows XP (v140_xp)

enter image description here

std库本身就产生了一个问题:

1>C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\cstdio(50): error C4995: 'sprintf': name was marked as #pragma deprecated
1>C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\cstdio(53): error C4995: 'vsprintf': name was marked as #pragma deprecated
1>C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\cstring(20): error C4995: 'strcat': name was marked as #pragma deprecated
1>C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\cstring(21): error C4995: 'strcpy': name was marked as #pragma deprecated
1>C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\cwchar(29): error C4995: 'swprintf': name was marked as #pragma deprecated
1>C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\cwchar(30): error C4995: 'vswprintf': name was marked as #pragma deprecated
1>C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\cwchar(32): error C4995: 'wcscat': name was marked as #pragma deprecated
1>C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\cwchar(34): error C4995: 'wcscpy': name was marked as #pragma deprecated

所以我不得不避免那些不安全功能的错误:

#pragma warning( push )
#pragma warning( disable: 4995 )
#include <stdio.h>
#include <new>
#include <string>
#pragma warning( pop )

哪一个远非理想!

(您基本上是为了编译该死的GDI +库而牺牲了应用程序的安全性。)

答案 2 :(得分:0)

如果您准备编辑Windows头文件,则有一种方法可以使其起作用。

objbase.h中,注释掉第239行或将其更改为:

static_assert (std::is_base_of <IUnknown *, *pp>::value, "pp must derive from IUnknown");

gdiplusheaders.h的第891行中,删除冗余限定符(Metafile::)。

gdiplusstringformat.h的第220行中,删除冗余限定符(StringFormat::)。

希望这能为您解决问题,而不会破坏任何东西。

答案 3 :(得分:0)

虽然问题很老,但只是添加对我有用的内容。

在我的情况下,包括 windows.h 和使用 VS2017 v141_xp 工具集编译导致我错误:语法错误:意外的标记“标识符”,预期的“类型说明符”。

这解决了我的问题 link