I’m trying to include the following definitions for GDI+ into my Win32 C++ project that is compiled under Visual Studio 2017:
#include <objidl.h>
#include <gdiplus.h>
#pragma comment (lib,"Gdiplus.lib")
I need to compile this project to support Windows XP. So in the project properies I selected: Platform Toolset
as Visual Studio 2017 - Windows XP (v141_xp)
:
But when I compile it the GDI+ library gives me this:
1>c:program files (x86)microsoft sdkswindowsv7.1aincludeobjbase.h(239): error C2760: syntax error: unexpected token 'identifier', expected 'type specifier'
1>c:program files (x86)microsoft sdkswindowsv7.1aincludegdiplusheaders.h(891): error C4596: 'EmfToWmfBits': illegal qualified name in member declaration
1>c:program files (x86)microsoft sdkswindowsv7.1aincludegdiplusstringformat.h(220): error C4596: 'GetTrimming': illegal qualified name in member declaration
Any idea how to fix this?
asked Jul 12, 2019 at 22:41
1
Add this line before the very first(!) #include
of COM-related header to fix objbase.h(239): error C2760: syntax error: unexpected token 'identifier', expected 'type specifier'
:
typedef struct IUnknown IUnknown;
This fix works, because the line in objbase.h(239)
mentioned in the error contains static_cast<IUnknown*>(*pp);
despite that IUnknown still haven’t been declared in that place.
answered Jun 12, 2020 at 17:31
Кое КтоКое Кто
4275 silver badges8 bronze badges
I kinda got it to compile, but this is definitely not a good solution. I’m posting it here as a temp workaround until Microsoft gets their heads out of their ___es. Also if anyone finds a better way, please let me know.
I basically had to downgrade the entire project to Visual Studio 2015 - Windows XP (v140_xp)
just to compile one badly written library:
This created a problem of its own with the std
libraries:
1>C:Program Files (x86)Microsoft Visual Studio 14.0VCincludecstdio(50): error C4995: 'sprintf': name was marked as #pragma deprecated
1>C:Program Files (x86)Microsoft Visual Studio 14.0VCincludecstdio(53): error C4995: 'vsprintf': name was marked as #pragma deprecated
1>C:Program Files (x86)Microsoft Visual Studio 14.0VCincludecstring(20): error C4995: 'strcat': name was marked as #pragma deprecated
1>C:Program Files (x86)Microsoft Visual Studio 14.0VCincludecstring(21): error C4995: 'strcpy': name was marked as #pragma deprecated
1>C:Program Files (x86)Microsoft Visual Studio 14.0VCincludecwchar(29): error C4995: 'swprintf': name was marked as #pragma deprecated
1>C:Program Files (x86)Microsoft Visual Studio 14.0VCincludecwchar(30): error C4995: 'vswprintf': name was marked as #pragma deprecated
1>C:Program Files (x86)Microsoft Visual Studio 14.0VCincludecwchar(32): error C4995: 'wcscat': name was marked as #pragma deprecated
1>C:Program Files (x86)Microsoft Visual Studio 14.0VCincludecwchar(34): error C4995: 'wcscpy': name was marked as #pragma deprecated
So I had to shunt those errors of unsafe functions:
#pragma warning( push )
#pragma warning( disable: 4995 )
#include <stdio.h>
#include <new>
#include <string>
#pragma warning( pop )
Which is far from ideal!
(You’re basically sacrificing security of the app just to compile that damn GDI+ library.)
answered Jul 13, 2019 at 20:57
c00000fdc00000fd
20.2k23 gold badges168 silver badges385 bronze badges
1
There’s a way to get this to work if you’re prepared to edit the Windows header files.
In objbase.h
, comment out line 239 or change it to:
static_assert (std::is_base_of <IUnknown *, *pp>::value, "pp must derive from IUnknown");
In gdiplusheaders.h
, line 891, remove the redundant qualifier (Metafile::
).
In gdiplusstringformat.h
, line 220, remove the redundant qualifier (StringFormat::
).
Hopefully, that will fix things for you without breaking anything.
answered Jul 13, 2019 at 23:23
Paul SandersPaul Sanders
22.9k4 gold badges25 silver badges48 bronze badges
1
Although the question is old, just adding what worked for me.
In my case including windows.h and compiling with VS2017 v141_xp toolset was causing me error: syntax error: unexpected token ‘identifier’, expected ‘type specifier’.
This resolved my issue link
answered Jul 15, 2021 at 15:43
Содержание
- Unity — Fix for Build Error C2760 in combaseapi.h — but still not working #1550
- Comments
- Библиотека GDI+ вызывает ошибку C2760: синтаксическая ошибка: неожиданный «идентификатор» токена, ожидаемый «описатель типа» в VS2017 при компиляции для XP
- Ответы (4)
- Библиотека GDI+ вызывает «ошибку C2760: синтаксическая ошибка: неожиданный токен» идентификатор «, ожидаемый» спецификатор типа «» в VS2017 при компиляции для XP
- 4 ответа
- Библиотека GDI + вызывает ошибку C2760: синтаксическая ошибка: неожиданный токен «идентификатор», ожидаемый «спецификатор типа» »в VS2017 при компиляции для XP
- Как создать проект C++, отличный от MFC, со статической привязкой к библиотекам времени выполнения VC?
Unity — Fix for Build Error C2760 in combaseapi.h — but still not working #1550
Hi, still can’t get the copter working. I did find a fix for the C2670 error though. Any thoughts appreciated.
Win 10 Home
Unity 2018.2.15f1
VS Community 2017 15.8.9
SDK 8.1
Unity/build.cmd Build fails with:
windows kits8.1includeumcombaseapi.h(229): error C2760: syntax error: unexpected token ‘identifier’, expected ‘type specifier’
1: Open (make backup first of course) C:Program Files (x86)Windows Kits8.1Includeumcombaseapi.h
2: Add struct IUnknown; // Workaround for «combaseapi.h(229): error C2187: syntax error: ‘identifier’ was unexpected here» when using /permissive-
3: Put this line at top of file above includes
4: Rebuild
5: Build succeeds but with warning:
«..PathAirSimUnityAirLibWrapperAirsimWrapper.sln» (Clean;Build target) (1) ->
«..PathAirSimUnityAirLibWrapperAirsimWrapperAirsimWrapper.vcxproj.metaproj» (default ta
rget) (2:2) ->
«..PathAirSimUnityAirLibWrapperAirsimWrapperAirsimWrapper.vcxproj» (default target) (5:
2) ->
(Link target) ->
LINK : warning LNK4075: ignoring ‘/INCREMENTAL’ due to ‘/LTCG’ specification [..PathAirSi
mUnityAirLibWrapperAirsimWrapperAirsimWrapper.vcxproj]
6: Run project SimModeSelector Unity Project Warning:
Cannot read settings file C:Program FilesUnityEditorsettings.json Vehicle=SimpleFlight
UnityEngine.Debug:LogError(Object)
AirSimUnity.Vehicle:PrintLogMessage(String, String, String, Int32) (at Assets/AirSimAssets/Scripts/Vehicles/Vehicle.cs:279)
AirSimUnity.VehicleCompanion:PrintLogMessage(String, String, String, Int32) (at Assets/AirSimAssets/Scripts/Vehicles/VehicleCompanion.cs:193)
7: Create settings.json file in Assets folder:
<
«SettingsVersion»: 1.2,
«SimMode»: «Multirotor»
>
8: Run Unity Project SimModeSelector. Copter does not respond to Page Up/Down & WASD
Car responds to WASD
The text was updated successfully, but these errors were encountered:
Источник
Библиотека GDI+ вызывает ошибку C2760: синтаксическая ошибка: неожиданный «идентификатор» токена, ожидаемый «описатель типа» в VS2017 при компиляции для XP
Я пытаюсь включить следующие определения для GDI+ в свой проект Win32 C++, скомпилированный в Visual Studio 2017:
Мне нужно скомпилировать этот проект для поддержки Windows XP. Итак, в свойствах проекта я выбрал: Platform Toolset как Visual Studio 2017 — Windows XP (v141_xp) :
Но когда я компилирую его, библиотека GDI+ дает мне это:
Есть идеи, как это исправить?
Ответы (4)
Добавьте эту строку перед самым первым (!) #include заголовком, связанным с COM, чтобы исправить objbase.h(239): error C2760: syntax error: unexpected token ‘identifier’, expected ‘type specifier’ :
Это исправление работает, потому что строка в objbase.h(239) , упомянутая в ошибке, содержит static_cast (*pp); , несмотря на то, что IUnknown еще не был объявлен в этом месте.
Я как бы получил его для компиляции, но это определенно не очень хорошее решение. Я публикую это здесь в качестве временного обходного пути, пока Microsoft не вылезет из головы. Также, если кто-то найдет лучший способ, пожалуйста, дайте мне знать.
По сути, мне пришлось понизить весь проект до Visual Studio 2015 — Windows XP (v140_xp) только для того, чтобы скомпилировать одну плохо написанную библиотеку:
Это создало собственную проблему с библиотеками std :
Поэтому мне пришлось шунтировать эти ошибки небезопасных функций:
Что далеко от идеала!
(По сути, вы жертвуете безопасностью приложения только для того, чтобы скомпилировать эту чертову библиотеку GDI+.)
Есть способ заставить это работать, если вы готовы редактировать заголовочные файлы Windows.
В objbase.h закомментируйте строку 239 или измените ее на:
В gdiplusheaders.h , строка 891, удалите лишний квалификатор ( Metafile:: ).
В gdiplusstringformat.h , строка 220, удалите лишний квалификатор ( StringFormat:: ).
Надеюсь, это исправит ситуацию для вас, ничего не сломав.
Хотя вопрос старый, просто добавляю то, что сработало для меня.
В моем случае включение windows.h и компиляция с набором инструментов VS2017 v141_xp вызывали у меня ошибку: синтаксическая ошибка: неожиданный «идентификатор» токена, ожидаемый «спецификатор типа».
Источник
Библиотека GDI+ вызывает «ошибку C2760: синтаксическая ошибка: неожиданный токен» идентификатор «, ожидаемый» спецификатор типа «» в VS2017 при компиляции для XP
Я пытаюсь включить следующие определения для GDI+ в мой проект Win32 C++, который скомпилирован в Visual Studio 2017:
Мне нужно скомпилировать этот проект для поддержки Windows XP. Поэтому в свойствах проекта я выбрал: Platform Toolset как Visual Studio 2017 — Windows XP (v141_xp) :
Но когда я компилирую это, библиотека GDI+ дает мне это:
Есть идеи как это исправить?
4 ответа
Добавьте эту строчку перед самым первым (!) #include заголовка, связанного с COM, чтобы исправить objbase.h(239): error C2760: syntax error: unexpected token ‘identifier’, expected ‘type specifier’ :
Это исправление работает, потому что строка в objbase.h(239) упомянутый в ошибке содержит static_cast (*pp); несмотря на то, что IUnknown до сих пор не объявлен в этом месте.
Я вроде получил его для компиляции, но это определенно не хорошее решение. Я опубликую его здесь как временное решение, пока Microsoft не избавится от своих ___ идей. Также, если кто-нибудь найдет лучший способ, пожалуйста, дайте мне знать.
Я в основном должен был понизить весь проект до Visual Studio 2015 — Windows XP (v140_xp) просто скомпилировать одну плохо написанную библиотеку:
Это создало собственную проблему с std библиотеки:
Таким образом, я должен был избежать ошибок небезопасных функций:
Что далеко от идеала!
(Вы в основном жертвуете безопасностью приложения, просто чтобы скомпилировать эту чертову библиотеку GDI+.)
Есть способ заставить это работать, если вы готовы редактировать заголовочные файлы Windows.
В objbase.h закомментируйте строку 239 или измените ее на:
В gdiplusheaders.h , строка 891, удалите лишний квалификатор ( Metafile:: ).
В gdiplusstringformat.h , строка 220, удалите лишний классификатор ( StringFormat:: ).
Надеюсь, это исправит ситуацию, не сломав ничего.
Хотя вопрос старый, просто добавляю то, что сработало для меня.
В моем случае включение windows.h и компиляция с набором инструментов VS2017 v141_xp вызывали у меня ошибку: синтаксическая ошибка: неожиданный «идентификатор» токена, ожидаемый «описатель типа».
Источник
Библиотека GDI + вызывает ошибку C2760: синтаксическая ошибка: неожиданный токен «идентификатор», ожидаемый «спецификатор типа» »в VS2017 при компиляции для XP
Я пытаюсь включить следующие определения для GDI + в свой проект Win32 C ++, который скомпилирован в Visual Studio 2017:
Мне нужно скомпилировать этот проект для поддержки Windows XP. Итак, в выбранном мной проекте свойства: Platform Toolset как Visual Studio 2017 — Windows XP (v141_xp) :
Но когда я его компилирую, библиотека GDI + дает мне следующее:
Есть идеи, как это исправить?
Добавьте эту строку перед самым первым (!) #include Заголовком, связанным с COM, чтобы исправить objbase.h(239): error C2760: syntax error: unexpected token ‘identifier’, expected ‘type specifier’ :
Это исправление работает, потому что строка, objbase.h(239) упомянутая в ошибке, содержит, static_cast (*pp); несмотря на то, что IUnknown еще не был объявлен в этом месте.
Мне удалось его скомпилировать, но это определенно не лучшее решение. Я публикую это здесь как временный обходной путь, пока Microsoft не избавится от своих ___es. Также, если кто-нибудь найдет способ получше, дайте мне знать.
Мне в основном пришлось понизить версию всего проекта, чтобы Visual Studio 2015 — Windows XP (v140_xp) просто скомпилировать одну плохо написанную библиотеку:
Это создало собственную проблему с std библиотеками:
Поэтому мне пришлось устранить эти ошибки небезопасных функций:
Что далеко не идеально!
(По сути, вы жертвуете безопасностью приложения только для того, чтобы скомпилировать эту чертову библиотеку GDI +.)
Источник
Как создать проект C++, отличный от MFC, со статической привязкой к библиотекам времени выполнения VC?
Я знаю, что для проекта MFC, созданного с помощью Visual Studio, можно перейти в свойства проекта, а затем Configuration Properties -> General -> use of MFC и изменить его на Use MFC in a static library :
Это работает, если полученная сборка должна запускаться в более ранних версиях Windows без необходимости установки DLL времени выполнения MFC или VC. Полученная сборка будет использовать библиотеки DLL, которые уже присутствуют в каждой установке Windows, начиная с Windows 7 и выше. (Возможно, даже до Windows XP.)
Теперь, если я создаю проект без MFC, скажем, тестовое консольное приложение C++, параметр для использования MFC настроен как «Использовать стандартные библиотеки Windows»:
Но если я запустил полученный двоичный файл, скажем, при новой установке Windows 7, я получаю такую ошибку:
Итак, покопавшись в настройках, я не смог найти способ скомпилировать его со статической привязкой ко всем этим новым версиям библиотек VC RT. Он есть, а я его просто не вижу?
PS. Покопавшись дальше, я обнаружил, что могу изменить «Platform Toolset» на Visual Studio 2017 — Windows XP (v141_xp) , предполагая, что это сделает его обратно совместимым с Windows XP и выше:
Но затем, если я его скомпилирую, я получаю следующие ошибки:
В этой части файла ObjBase.h , который не имеет ничего общего с моим тестовым консольным проектом C++, который я только что создал из шаблона Visual Studio:
Итак, мой вопрос: могу ли я создать проект на C++, отличный от MFC, который может работать в более старых версиях Windows без необходимости установки VC Runtime или каких-либо других дополнительных библиотек?
Источник
Я пытаюсь включить следующие определения для GDI+ в свой проект Win32 C++, скомпилированный в Visual Studio 2017:
#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 sdkswindowsv7.1aincludeobjbase.h(239): error C2760: syntax error: unexpected token 'identifier', expected 'type specifier'
1>c:program files (x86)microsoft sdkswindowsv7.1aincludegdiplusheaders.h(891): error C4596: 'EmfToWmfBits': illegal qualified name in member declaration
1>c:program files (x86)microsoft sdkswindowsv7.1aincludegdiplusstringformat.h(220): error C4596: 'GetTrimming': illegal qualified name in member declaration
Есть идеи, как это исправить?
Я как бы получил его для компиляции, но это определенно не очень хорошее решение. Я публикую это здесь в качестве временного обходного пути, пока Microsoft не вылезет из головы. Также, если кто-то найдет лучший способ, пожалуйста, дайте мне знать.
По сути, мне пришлось понизить весь проект до Visual Studio 2015 - Windows XP (v140_xp)
только для того, чтобы скомпилировать одну плохо написанную библиотеку:
Это создало собственную проблему с библиотеками std
:
1>C:Program Files (x86)Microsoft Visual Studio 14.0VCincludecstdio(50): error C4995: 'sprintf': name was marked as #pragma deprecated
1>C:Program Files (x86)Microsoft Visual Studio 14.0VCincludecstdio(53): error C4995: 'vsprintf': name was marked as #pragma deprecated
1>C:Program Files (x86)Microsoft Visual Studio 14.0VCincludecstring(20): error C4995: 'strcat': name was marked as #pragma deprecated
1>C:Program Files (x86)Microsoft Visual Studio 14.0VCincludecstring(21): error C4995: 'strcpy': name was marked as #pragma deprecated
1>C:Program Files (x86)Microsoft Visual Studio 14.0VCincludecwchar(29): error C4995: 'swprintf': name was marked as #pragma deprecated
1>C:Program Files (x86)Microsoft Visual Studio 14.0VCincludecwchar(30): error C4995: 'vswprintf': name was marked as #pragma deprecated
1>C:Program Files (x86)Microsoft Visual Studio 14.0VCincludecwchar(32): error C4995: 'wcscat': name was marked as #pragma deprecated
1>C:Program Files (x86)Microsoft Visual Studio 14.0VCincludecwchar(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+.)
person
c00000fd
schedule
13.07.2019
holdem_ 0 / 0 / 0 Регистрация: 27.10.2018 Сообщений: 21 |
||||||||||||
1 |
||||||||||||
04.05.2019, 22:41. Показов 7072. Ответов 12 Метки ООП, шаблоны (Все метки)
При компиляции выдает ошибку : Ошибка C2760 синтаксическая ошибка: ожидался токен «спецификатор типа», а не «идентификатор» .
__________________
0 |
143 / 92 / 34 Регистрация: 30.01.2018 Сообщений: 467 |
|
04.05.2019, 22:44 |
2 |
В какой строке ошибка, а то просматривать весь код очень муторно
0 |
0 / 0 / 0 Регистрация: 27.10.2018 Сообщений: 21 |
|
04.05.2019, 22:49 [ТС] |
3 |
в 69 строке Добавлено через 51 секунду Добавлено через 48 секунд
0 |
143 / 92 / 34 Регистрация: 30.01.2018 Сообщений: 467 |
|
04.05.2019, 22:52 |
4 |
m_iArr = new init.T*[size_row]; Что такое init.T?
1 |
0 / 0 / 0 Регистрация: 27.10.2018 Сообщений: 21 |
|
04.05.2019, 23:02 [ТС] |
5 |
Что такое init.T? Да , просто T должно быть Добавлено через 2 минуты
Что такое init.T? Но когда делаю просто T , появляется
0 |
143 / 92 / 34 Регистрация: 30.01.2018 Сообщений: 467 |
|
04.05.2019, 23:04 |
6 |
Как у тебя сейчас 69 строка выглядит?
0 |
holdem_ 0 / 0 / 0 Регистрация: 27.10.2018 Сообщений: 21 |
||||
04.05.2019, 23:13 [ТС] |
7 |
|||
0 |
Pashka Durov 143 / 92 / 34 Регистрация: 30.01.2018 Сообщений: 467 |
||||
04.05.2019, 23:20 |
8 |
|||
Попробуй так
Но не гарантирую
0 |
holdem_ 0 / 0 / 0 Регистрация: 27.10.2018 Сообщений: 21 |
||||
05.05.2019, 11:52 [ТС] |
9 |
|||
Попробуй так
Но не гарантирую На 69 строку перестало ругаться , но всеравно есть ошибка в 72 строке : Добавлено через 1 минуту
0 |
5696 / 3134 / 1307 Регистрация: 07.02.2019 Сообщений: 7,876 |
|
05.05.2019, 11:56 |
10 |
holdem_, Просто скопируй цикл из строк 25-28.
0 |
0 / 0 / 0 Регистрация: 27.10.2018 Сообщений: 21 |
|
05.05.2019, 12:00 [ТС] |
11 |
holdem_, Просто скопируй цикл из строк 25-28. На эти строки тоже ругается .
0 |
zayats80888 5696 / 3134 / 1307 Регистрация: 07.02.2019 Сообщений: 7,876 |
||||
05.05.2019, 12:16 |
12 |
|||
На эти строки тоже ругается Матом? Добавлено через 11 минут
0 |
holdem_ 0 / 0 / 0 Регистрация: 27.10.2018 Сообщений: 21 |
||||
05.05.2019, 12:57 [ТС] |
13 |
|||
Матом? Добавлено через 11 минут
Все решил проблему — действительно не нужно реализовывать шаблонные классы по разным файлам . Всем спасибо за ответы
0 |