我正在尝试将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)
:
但是当我编译它时,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
有什么解决方法吗?
答案 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)
:
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