2012-09-30 68 views
12

我在使用Visual Studio 2012宏定義衝突WINERROR.H

Windows 7中當我編譯我得到了很多引起Winerror.h中與dxgi.h宏重新定義警告,dxgitype .h,d3d11.h,d3d10.h;例如DXGI_STATUS_OCCLUDED,DXGI_STATUS_CLIPPED,DXGI_STATUS_NO_REDIRECTION等。

我想這是因爲安裝了windows sdk 8。 我該如何避免這種情況?有沒有辦法可以從我的項目中排除這些新庫?

+1

請分享包括的順序。另外你爲什麼要在同一個文件包含結構中使用d3d10和d3d11? – Ram

+1

@Ram,d3d10包含在d3d11的某個部分。 – chris

+0

我嘗試刪除一切,但d3d11.h,其中又包括dxgi.h和dxgitype.h –

回答

11

我就遇到了這個問題,使用Visual Studio 2012快速在Windows 8;但是,我的錯誤幾乎完全相同,並且修復以Windows SDK爲中心。 This was in MSDN (see #5)

D3DX不被視爲在Windows 8中使用Direct3D的規範API,因此不包含在相應的Windows SDK中。調查使用Direct3D API的備用解決方案。

對於傳統項目,比如Windows 7(或更早)的DirectX SDK樣本,下面的步驟是必須與使用DirectX SDK D3DX來構建應用程序:

一個。按如下方式修改項目的VC++目錄,以便爲SDK標頭和庫使用正確的順序。

  1. 打開項目屬性並選擇VC++目錄頁面。
  2. 選擇所有配置和所有平臺。
  3. 設置這些目錄如下:

    • 包含目錄:$(INCLUDEPATH); $(DXSDK_DIR)包括
    • 庫目錄:$(LibraryPath); $(DXSDK_DIR)庫\ X86
  4. 單擊應用。
  5. 選擇x64平臺。
  6. 設置庫目錄如下:

    • 庫目錄:$(LibraryPath); $(DXSDK_DIR)庫\ 64

灣無論何處「d3dx9.h」,「d3dx10。h「或」d3dx11.h「包含在您的項目中,請務必明確包含」d3d9.h「,」d3d10.h「和」dxgi.h「或」d3d11.h「和」dxgi.h「首先要確保你正在拾取新版本,如果需要,可以禁用警告C4005;但是,此警告表明您正在使用這些標頭的較舊版本

c。刪除項目中對DXGIType.h的所有引用。這個頭文件在Windows SDK中不存在,並且DirectX SDK版本與新的winerror.h衝突

d。通過DirectX SDK安裝將所有D3DX DLL安裝到您的開發計算機上確保必要如果將D3DX依賴關係移動到另一臺機器,則它們會與任何示例或應用程序一起重新分發。

e。請注意,D3DX11當前使用的替代技術包括​​和DirectXTK。 D3DXMath被DirectXMath取代。

我不能肯定地說,但我認爲Windows 8 SDK可能是您的問題。這可能有點痛苦,但使用上面的修復將有助於使您的代碼需要較少的依​​賴性,並使其兼容Windows 7和Windows 8.

+0

感謝您的廣泛答覆。自從我切換到Windows8以來,我從頭開始編寫所有內容,所以我沒有任何問題。幸運的是,用DirectXTK和FW1FontWrapper替換d3dx很容易。我會將此標記爲已接受的答案,對於那些遇到同樣問題的人來說,這將會非常有用。 –

0

我改變了設置,其中包括從Windows套件\ 8.0裏面的DirectX。

其實我想,而不是忽略它,並使用Windows頭文件和庫我以前用過,但也許它沒有很大的差異。

唯一的一點是,現在我要在D3DX實用程序不再訪問。

15

我遇到了這個問題,在Windows 8上用Visual Studios 2012編譯SlimDX。Windows SDK包含默認情況下繼承,因此它們在手動定義的項目包含目錄後加載。要修復它,請將Windows SDK添加爲第一個包含目錄。 $(WindowsSDK_IncludePath)

+0

謝謝,我正在遵循一些更復雜的指示。這些是我需要的! – aPerfectMisterMan

+0

也許移除對DirectX SDK的引用是**正確的**方式,但這種解決方案非常快速和整潔。 ^^ – NPS

0

另一個快速修復 - 快速,如在'可能不是最好的長期解決方案「 - 是在Solution/Properties/General下更改」平臺工具集「 - 在我的具體情況中,我選擇了」Visual Studio 2015 - Windows XP(v140_xp)「而不是」Visual Studio 2015(v140 )」。

1

(耶,我的#2的第一個答案)

發現一個,希望好,變通方法問題:請您自己的頭文件,包括WINDOWS.H(D3D11包括反正),取消定義宏的窗戶幷包含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> 

請讓我知道你在想什麼,不要憋在批評。我對此很陌生,並且知道這是相當殘暴的行爲,可能有風險。