Согласование макросов между заголовками DirectX и winerror.h
Я использую Windows 7 с помощью Visual Studio 2012.
Когда я компилирую, я получаю много предупреждений о переопределении макросов, вызванных winerror.h по сравнению с dxgi.h, dxgitype.h, d3d11.h, d3d10.h; например DXGI_STATUS_OCCLUDED, DXGI_STATUS_CLIPPED, DXGI_STATUS_NO_REDIRECTION и т.д.
Я предполагаю, что это связано с тем, что установлены окна sdk 8.
Как я могу избежать этого? Есть ли способ исключить эти новые библиотеки из моего проекта?
Ответы
Ответ 1
Я столкнулся с этой проблемой, используя Visual Studio 2012 Express в Windows 8; однако мои ошибки были почти такими же, и исправление сосредоточено вокруг Windows SDK. Это было в MSDN (см. №5):
D3DX не считается каноническим API для использования Direct3D в Windows 8 и поэтому не входит в соответствующий Windows SDK. Изучите альтернативные решения для работы с Direct3D API.
Для старых проектов, таких как образцы Windows 7 (и более ранних) DirectX SDK, для создания приложений с D3DX с помощью DirectX SDK необходимы следующие шаги:
а. Измените каталоги проектов VС++ следующим образом, чтобы использовать правильный порядок для заголовков и библиотек SDK.
б. Где бы ни были "d3dx9.h", "d3dx10.h" или "d3dx11.h", обязательно укажите "d3d9.h", "d3d10.h" и "dxgi.h" или "d3dx9.h", d3d11.h "и" dxgi.h ", чтобы убедиться, что вы выбираете новую версию. Вы можете отключить предупреждение C4005, если необходимо; однако это предупреждение указывает, что вы используете более старую версию этих заголовков.
с. Удалите все ссылки на DXGIType.h в своем проекте. Этот заголовок не существует в SDK Windows, и версия DirectX SDK конфликтует с новым winerror.h.
д. Все DLL D3DX установлены на ваш компьютер разработки с помощью установки DirectX SDK. Убедитесь, что необходимые зависимости D3DX перераспределяются с любым образцом или с вашим приложением, если он перемещен на другую машину.
е. Имейте в виду, что технологии замены для текущего использования D3DX11 включают DirectXTex и DirectXTK. D3DXMath заменяется на DirectXMath.
Я не могу сказать точно, но я думаю, что Windows 8 SDK может быть вашей проблемой. Это может быть немного больно, но использование исправления выше поможет сделать ваш код менее зависимым, а также сделать его совместимым как с Windows 7, так и с Windows 8.
Ответ 2
Я столкнулся с этой проблемой, компилируя SlimDX с Visual Studios 2012 в Windows 8. Windows SDK включает в себя унаследованные по умолчанию, поэтому они загружаются после того, как указанные вручную проекты включают каталоги. Чтобы исправить это, добавьте Windows SDK в качестве первого каталога include. $(WindowsSDK_IncludePath)
Ответ 3
(Yay, мой первый ответ на Stackoverflow)
Нашел, надеюсь, хорошо, обходной путь к проблеме: Создайте свой собственный заголовочный файл, который включает Windows.h(D3D11 включает это в любом случае), undefines windows macros и включает D3D11.h. Включите этот заголовок вместо D3D11.h.
Примечание. Очевидно, что это определяет приоритеты D3D11 версий, чем версии Windows.h
// D3D11-NoRedefs.h
// Includes D3D11.h without redefinitions from Windows!
#pragma once
#include <Windows.h>
//#pragma region Undefine Windows Macros
// Only undefine, if DXGIType.h has not been included yet
#ifndef __dxgitype_h__
#undef DXGI_STATUS_OCCLUDED
#undef DXGI_STATUS_CLIPPED
#undef DXGI_STATUS_NO_REDIRECTION
#undef DXGI_STATUS_NO_DESKTOP_ACCESS
#undef DXGI_STATUS_GRAPHICS_VIDPN_SOURCE_IN_USE
#undef DXGI_STATUS_MODE_CHANGED
#undef DXGI_STATUS_MODE_CHANGE_IN_PROGRESS
#undef DXGI_ERROR_INVALID_CALL
#undef DXGI_ERROR_NOT_FOUND
#undef DXGI_ERROR_MORE_DATA
#undef DXGI_ERROR_UNSUPPORTED
#undef DXGI_ERROR_DEVICE_REMOVED
#undef DXGI_ERROR_DEVICE_HUNG
#undef DXGI_ERROR_DEVICE_RESET
#undef DXGI_ERROR_WAS_STILL_DRAWING
#undef DXGI_ERROR_FRAME_STATISTICS_DISJOINT
#undef DXGI_ERROR_GRAPHICS_VIDPN_SOURCE_IN_USE
#undef DXGI_ERROR_DRIVER_INTERNAL_ERROR
#undef DXGI_ERROR_NONEXCLUSIVE
#undef DXGI_ERROR_NOT_CURRENTLY_AVAILABLE
#undef DXGI_ERROR_REMOTE_CLIENT_DISCONNECTED
#undef DXGI_ERROR_REMOTE_OUTOFMEMORY
#undef D3D11_ERROR_TOO_MANY_UNIQUE_STATE_OBJECTS
#undef D3D11_ERROR_FILE_NOT_FOUND
#undef D3D11_ERROR_TOO_MANY_UNIQUE_VIEW_OBJECTS
#undef D3D11_ERROR_DEFERRED_CONTEXT_MAP_WITHOUT_INITIAL_DISCARD
#undef D3D10_ERROR_TOO_MANY_UNIQUE_STATE_OBJECTS
#undef D3D10_ERROR_FILE_NOT_FOUND
#endif
#pragma endregion
#include <D3D11.h>
Пожалуйста, дайте мне знать, что вы думаете, и не сдерживайте критику. Я новичок в этом и знаю, что это довольно грубая сила и, вероятно, рискованная.
Ответ 4
Я изменил настройки и включил directx изнутри Windows Kits\8.0.
На самом деле я хотел вместо этого игнорировать его и использовать заголовки и библиотеки Windows, которые я использовал раньше, но, возможно, это не имеет большого значения.
Единственное, что теперь у меня больше нет доступа к утилитам d3dx.
Ответ 5
Еще одно быстрое решение - как, например, "вероятно, не лучшее долгосрочное решение" - это изменить "набор инструментов платформы" в разделе "Решение/Свойства/Общие" - в моем конкретном случае я выбрал "Visual Studio 2015 - Windows XP (v140_xp)" вместо "Visual Studio 2015 (v140)".