2012-09-30 19 views
12

estoy en Windows 7 utilizando Visual Studio 2012.Macro choque definición entre los encabezados de DirectX y Winerror.h

Cuando compilo consigo una gran cantidad de advertencias redefinición macro causadas por Winerror.h frente dxgi.h, dxgitype .h, d3d11.h, d3d10.h; por ejemplo DXGI_STATUS_OCCLUDED, DXGI_STATUS_CLIPPED, DXGI_STATUS_NO_REDIRECTION etc.

Supongo que esto se debe a que el Windows SDK 8 está instalado. ¿Cómo puedo evitar esto? ¿Hay alguna manera de excluir estas nuevas bibliotecas de mi proyecto?

+1

Por favor, comparta el orden de los includes. Además, ¿por qué quiere usar d3d10 y d3d11 en la misma estructura de archivos incluidos? – Ram

+1

@Ram, d3d10 está incluido en alguna parte de d3d11. – chris

+0

Intenté eliminar todo menos d3d11.h, que a su vez incluye dxgi.h y dxgitype.h –

Respuesta

11

me encontré con este problema utilizando Visual Studio 2012 Express en Windows 8; sin embargo, mis errores fueron casi exactamente los mismos, y la solución se centra en el SDK de Windows. This was in MSDN (see #5):

D3DX no se considera la API canónica para el uso de Direct3D en Windows 8 y por lo tanto no está incluido con el correspondiente SDK de Windows. Investigue soluciones alternativas para trabajar con Direct3D API.

Para proyectos heredados, como el Windows 7 (y versiones anteriores) DirectX SDK muestras, los siguientes pasos son necesarios para construir aplicaciones con D3DX utilizando el SDK de DirectX:

a. Modifique los directorios de VC++ del proyecto de la siguiente manera para usar el orden correcto para encabezados y bibliotecas de SDK.

  1. Abra Propiedades para el proyecto y seleccione la página Directorios de VC++.
  2. Seleccione todas las configuraciones y todas las plataformas.
  3. Establecer estos directorios de la siguiente manera:

    • Incluir Directorios: $ (IncludePath); $ (DXSDK_DIR) Incluir
    • Directorios Bibliotecas: $ (LibraryPath); $ (DXSDK_DIR) Lib \ x86
  4. Haga clic en Aplicar.
  5. Elija la plataforma x64.
  6. establecer el directorio de la biblioteca de la siguiente manera:

    • Directorios Bibliotecas: $ (LibraryPath); $ (DXSDK_DIR) Lib \ x64

b. Dondequiera que "d3dx9.h", "d3dx10.h ", o" d3dx11.h "están incluidos en su proyecto, asegúrese de incluir explícitamente" d3d9.h "," d3d10.h "y" dxgi.h ", o" d3d11.h "y" dxgi.h " primero para asegurarse de que está recogiendo la versión más nueva. Puede deshabilitar la advertencia C4005 si es necesario; sin embargo, esta advertencia indica que está utilizando la versión anterior de estos encabezados.

c. Elimine todas las referencias a DXGIType.h en su proyecto Este encabezado no existe en el SDK de Windows y la versión de DirectX SDK entra en conflicto con el nuevo winerror.h

d. Todos los archivos D3DX se instalan en su computadora de desarrollo con la instalación de DirectX SDK. Las dependencias D3DX se redistribuyen con cualquier muestra o con su aplicación si se mueven a otra máquina.

e. Tenga en cuenta que las tecnologías de reemplazo para los usos actuales de D3DX11 incluyen DirectXTex y DirectXTK. D3DXMath se reemplaza por DirectXMath.

No puedo decirlo con certeza, pero creo que el SDK de Windows 8 podría ser su problema. Puede ser un poco molesto, pero usar la solución anterior ayudará a que su código requiera menos dependencias además de hacerlo compatible con Windows 7 y Windows 8.

+0

Gracias por la amplia respuesta. Desde que cambié a Windows8 escribí todo desde cero, así que no tuve problemas. Afortunadamente, fue fácil reemplazar d3dx con DirectXTK y FW1FontWrapper. Voy a marcar esto como la respuesta aceptada, será útil para las personas que tienen los mismos problemas. –

0

Cambié la configuración e incluí el directx desde Windows Kits \ 8.0.

realidad quería en lugar de ignorarlo y utilizar los encabezados de las ventanas y las bibliotecas que he usado antes, pero tal vez no hacer una gran diferencia.

Lo único es que ahora tengo no más el acceso a los servicios públicos D3DX.

15

me encontré con este problema compilar SlimDX con Visual Estudios 2012 en Windows 8. Windows SDK incluye se heredan de forma predeterminada para que se carguen después de proyecto definido de forma manual incluye directorios. Para solucionarlo, agregue el SDK de Windows como el primer directorio de inclusión. $(WindowsSDK_IncludePath)

+0

Gracias, estaba siguiendo algunas instruciones mucho más complejas. ¡Esto era lo que necesitaba! – aPerfectMisterMan

+0

Tal vez la eliminación de referencias a DirectX SDK es el camino ** correcto **, pero esta solución es tan rápida y ordenada. ^^ – NPS

0

Otra solución rápida: rápida, como en ' probablemente no sea la mejor solución a largo plazo '- es cambiar el "conjunto de herramientas de la plataforma" en Solución/Propiedades/General - en mi caso específico seleccioné "Visual Studio 2015 - Windows XP (v140_xp)" en lugar de "Visual Studio 2015 (v140) ".

1

(¡Sí, mi primera respuesta en Stackoverflow)

Encontrado una, es de esperar buena, solución para el problema: Haga su propia cabecera de archivo, que incluye Windows.h (D3D11 incluye que de todos modos), undefines ventanas macros e incluye D3D11.h. Incluya este encabezado en lugar de D3D11.h. Nota: Obviamente, esto da prioridad a las versiones D3D11 de definición, sobre los de 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> 

Por favor, hágamelo saber lo que piensa, y no ocupen de nuevo en la crítica. Soy nuevo en esto y sé que esto es bastante fuerza bruta y probablemente sea arriesgado.

Cuestiones relacionadas