Подтвердить что ты не робот

Согласование макросов между заголовками 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. Как я могу избежать этого? Есть ли способ исключить эти новые библиотеки из моего проекта?

4b9b3361

Ответ 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.

  • Откройте "Свойства" для проекта и выберите страницу "Каталоги VС++".
  • Выберите все конфигурации и все платформы.
  • Установите эти каталоги следующим образом:

    • Включить каталоги: $(IncludePath); $(DXSDK_DIR) Включить
    • Библиотечные каталоги: $(LibraryPath); $(DXSDK_DIR) Lib\x86
  • Нажмите "Применить".
  • Выберите платформу x64.
  • Установите каталог библиотеки следующим образом:

    • Библиотечные каталоги: $(LibraryPath); $(DXSDK_DIR) Lib\x64

б. Где бы ни были "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)".