2012-09-30 13 views
12

Sono su Windows 7 utilizzando Visual Studio 2012.definizione scontro Macro fra le intestazioni delle DirectX e Winerror.h

Quando compilo ho un sacco di avvertimenti macro ridefinizione causati da Winerror.h contro dxgi.h, dxgitype .h, d3d11.h, d3d10.h; ad esempio DXGI_STATUS_OCCLUDED, DXGI_STATUS_CLIPPED, DXGI_STATUS_NO_REDIRECTION ecc.

Suppongo che ciò sia dovuto al fatto che Windows sdk 8 è installato. Come posso evitare questo? Esiste un modo per escludere queste nuove librerie dal mio progetto?

+1

Si prega di condividere l'ordine di include. Inoltre, perché vuoi usare d3d10 e d3d11 nella stessa struttura di inclusione del file? – Ram

+1

@Ram, d3d10 è incluso da qualche parte di d3d11. – chris

+0

Ho provato a rimuovere tutto tranne d3d11.h, che a sua volta include dxgi.h e dxgitype.h –

risposta

11

mi sono imbattuto in questo problema utilizzando Visual Studio 2012 Express su Windows 8; tuttavia, i miei errori erano quasi identici e la correzione è centrata su Windows SDK. This was in MSDN (see #5):

D3DX non è considerato l'API canonica per utilizzare Direct3D in Windows 8 e pertanto non è incluso con il corrispondente SDK Windows. Indagare soluzioni alternative per lavorare con l'API Direct3D.

Per i progetti precedenti, come ad esempio il Windows 7 (e versioni precedenti) campioni DirectX SDK, sono necessari per creare applicazioni con D3DX utilizzando il DirectX SDK le seguenti operazioni:

a. Modificare le directory VC++ del progetto come segue per utilizzare l'ordine corretto per le intestazioni e le librerie SDK.

  1. Aprire Proprietà per il progetto e selezionare la pagina VC++ Directories.
  2. Seleziona tutte le configurazioni e tutte le piattaforme.
  3. Impostare queste directory come segue:

    • includere le directory: $ (INCLUDEPATH); $ (DXSDK_DIR) Includere
    • directory di libreria: $ (LibraryPath); $ (DXSDK_DIR) Lib \ x86
  4. Fare clic su Applica.
  5. Scegli la piattaforma x64.
  6. impostare la directory di libreria come segue:

    • directory di libreria: $ (LibraryPath); $ (DXSDK_DIR) Lib \ x64

b. Ovunque "d3dx9.h", "d3dx10.h ", o" d3dx11.h "sono inclusi nel tuo progetto, assicurati di includere esplicitamente" d3d9.h "," d3d10.h "e" dxgi.h ", o" d3d11.h "e" dxgi.h ". prima per garantire la si sta raccogliendo la versione più recente È possibile disattivare C4005 avviso se necessario;. tuttavia, questo avviso indica che si sta utilizzando la versione precedente di queste intestazioni

c Rimuovere tutti i riferimenti a DXGIType.h nel progetto.. . Questa intestazione non esiste in Windows SDK, ed i conflitti di versione DirectX SDK con il nuovo Winerror.h.

d. DLL Tutti D3DX sono installati sul vostro computer di sviluppo per l'installazione di DirectX SDK. Assicurarsi che la necessaria Le dipendenze D3DX vengono ridistribuite con qualsiasi campione o con l'applicazione se viene spostata su un'altra macchina.

e. Essere consapevoli del fatto che le tecnologie di sostituzione per gli usi correnti di D3DX11 includono DirectXTex e DirectXTK. D3DXMath è sostituito da DirectXMath.

Non posso dirlo con certezza, ma penso che l'SDK di Windows 8 potrebbe essere il tuo problema. Potrebbe essere un po 'un problema, ma usare la correzione sopra aiuterà a rendere il codice richiede meno dipendenze e renderlo compatibile sia con Windows 7 sia con Windows 8.

+0

Grazie per la risposta esauriente. Da quando sono passato a windows8 ho scritto tutto da zero quindi non ho avuto problemi. Fortunatamente è stato facile sostituire d3dx con DirectXTK e FW1FontWrapper. Segnalo come risposta accettata, sarà utile per le persone che hanno gli stessi problemi. –

0

Ho modificato le impostazioni e incluso Directx dall'interno di Windows Kits \ 8.0.

realtà volevo invece di ignorarlo e utilizzare Windows intestazioni e le librerie che ho usato prima, ma forse non fa molta differenza.

L'unica cosa è che ora non ho più accesso alle utilità d3dx.

15

Mi sono imbattuto in questo problema compilando SlimDX con Visual Studios 2012 su Windows 8. Windows SDK include sono ereditati per impostazione predefinita in modo che vengano caricati dopo le directory di progetto incluse definite manualmente. Per risolvere il problema aggiungi Windows SDK come prima directory di inclusione. $(WindowsSDK_IncludePath)

+0

Grazie, stavo seguendo alcune istruzioni molto più complesse. Questi erano ciò di cui avevo bisogno! – aPerfectMisterMan

+0

Forse la rimozione dei riferimenti a DirectX SDK è la ** giusta ** strada da percorrere, ma questa soluzione è così veloce e accurata. ^^ – NPS

0

Un'altra soluzione rapida - veloce, come in' probabilmente non la migliore soluzione a lungo termine '- è di cambiare il "set di strumenti della piattaforma" sotto Soluzione/Proprietà/Generale - nel mio caso specifico ho selezionato "Visual Studio 2015 - Windows XP (v140_xp)" invece di "Visual Studio 2015 (v140)".

1

(Yay, la mia prima risposta su StackOverflow)

Trovato un, speriamo bene, soluzione alternativa al problema: crea il tuo file di intestazione, che include Windows.h (D3D11 comprende che in ogni modo), non-definisce finestre macro e include D3D11.h. Includi questa intestazione invece di D3D11.h. Nota: Ovviamente questa priorità versioni D3D11 di definizione, su quelle di 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> 

prega fatemi sapere cosa ne pensate, e non trattenere sulla critica. Sono nuovo di questo e so che questa è una forza bruta e probabilmente rischiosa.

Problemi correlati