傳統D3D11程式面向VS2015編譯環境的配置修正細節

neoragex2002發表於2016-01-04

A.  配置細節

  • 使用#include <unordered_map>替代<hash_map>
    • 這個是c++標準建議的,沒啥好說的
  • 使用#include <directxmath.h>替代<xnamath.h>
    • 注意:如不想修改原xnamath程式碼,則需在包含directxmath.h之前定義_XM_NO_INTRINSICS_宏標誌,以與原xnamath程式碼相容
    • 然而,_XM_NO_INTRINSICS_標誌將指示directxmath不使用SSE/SSE2等增強型指令集,因此其數學實現極慢。如果想速度快,還是得去掉該標誌,並相應地重寫原xnamath程式碼為妥
  • 去除d3dx11,不再使用任何legacy DX SDK中的標頭檔案或lib,堅持使用win SDK 8.0
    • 這個是保障vs2015能夠順利編譯連結、並且避免後繼編譯連結配置混亂的關鍵
    • 去除專案設定中legacy DX SDK相關的include、lib路徑定義
    • 去除連結設定中legacy DX SDK相關的lib依賴,包括d3dx11.lib、dxerr.lib等;這些lib不要寫在專案工程的linker inputs裡面,用#pragma comment寫在標頭檔案裡面
  • 針對d3dx11,使用DirectXTex庫來進行替代;DirectXTex lib需用vs2015重新編譯
    • 注意:DirectXTex庫的API較d3dx11的API形式上變化極大,如紋理載入API等。所有d3dx11相關的程式碼均可能需要重寫,這塊是最大的工作量
  • 針對dxerr,可找到其原始碼.cpp/h,將其直接包含進專案,一起編譯
    • 注意:不能再使用legacy dx sdk中的dxerr.lib,因其使用了過時的庫,因此在vs2015中無法link
    • 在直接包含編譯dxerr.h/cpp的同時,可能會碰到若干預定義標誌重定義,得自己手工調整一下
    • 在#include <dxerr.h>之前,需新增#include <Mmreg.h>定義
  • 針對effect11,其lib需用vs2015重新編譯
    • 為提升STL除錯時效率,可將_HAS_ITERATOR_DEBUGGING、_SECURE_SCL編制標誌設定為0,關閉迭代子除錯功能;注意:在編譯directxTex、effect11等外部lib時,也必須設定上述標誌,否則無法link
  • 針對d3d_compiler,可直接使用win sdk 8自帶的lib
    • 注意:d3d_compiler.lib會執行時呼叫d3dcompiler_XX.dll(xx是版本號),需要將這個dll複製到系統目錄或程式當前目錄下,以便執行時能夠載入
    • 注意:這個dll在win sdk 8的bin目錄裡面有,但有x32、x64兩個版本,在複製dll時千萬別拷錯了版本,否則執行時崩潰(0xc000007b Error)

B.   參考文獻

  1. http://blogs.msdn.com/b/chuckw/
  2. http://blogs.msdn.com/b/chuckw/archive/2012/04/24/where-s-dxerr-lib.aspx
  3. http://blogs.msdn.com/b/chuckw/archive/2013/08/21/living-without-d3dx.aspx
  4. http://blogs.msdn.com/b/chuckw/archive/2015/08/05/where-is-the-directx-sdk-2015-edition.aspx
  5. https://github.com/Microsoft/DirectXTex/wiki/DirectXTex
  6. https://github.com/Microsoft/DirectXTK/wiki
  7. https://github.com/Microsoft/DirectXMesh/wiki
  8. https://github.com/Microsoft/FX11/wiki
  9. https://msoos.wordpress.com/2010/09/11/0xc000007b-error-solution/

相關文章