在讀完紅龍書《DirectX 9.0 3D游戲開發編程基礎》一書后,該書作者推薦去讀微軟官方的DirectX的例子代碼(就保存在安裝好后的DirectX SDK的安裝目錄里面),認為讀這些例子是讀完此書后提升的絕佳選擇(此書電子版pdf第10頁記載這一說法)
具體操作:
先下載安裝 Microsoft DirectX SDK (June 2010)
然后去找 D:\Program Files (x86)\Microsoft DirectX SDK (June 2010)\Samples\C++\Direct3D 目錄下面的Direct3D例子(有33個,所有這33個例子編譯好的可執行文件在
D:\Program Files (x86)\Microsoft DirectX SDK (June 2010)\Samples\C++\Direct3D\Bin 目錄下的x86和x64 兩個目錄里面)
首先從 D:\Program Files (x86)\Microsoft DirectX SDK (June 2010)\Samples\C++\Direct3D\EmptyProject 這個例子開始看,
該例子僅需要經過兩處修改,就可以在vs2019上編譯通過,生成一個藍色背景的窗口。
vs2019編譯該例子的方法,先打開vs2019,找到D:\Program Files (x86)\Microsoft DirectX SDK (June 2010)\Samples\C++\Direct3D\EmptyProject\EmptyProject_2010.sln
選中打開, vs2019會提示你要升級平台什么玩意的,不管他,點擊確定,項目就打開了。
按F7編譯,報錯,
(1)說 abs 有什么重載說不清的問題之類,不管,點擊報錯定位到出錯處,把abs修改為fabs
(2)修復abs錯誤后,還有羅里吧嗦的錯誤,靠!查找解決方法,發現需要在報錯的源文件開頭處添加一條編譯預處理指令
#pragma comment(lib, "legacy_stdio_definitions.lib")
(為何要添加此編譯預處理指令的原因?參見 https://blog.csdn.net/qq_27474555/article/details/106255215)
我把原因也直接貼這里得了:
LNK2019 無法解析的外部符號 _vsnwprintf在DxErr.lib(dxerrw.obj)
報錯原因:vs2017默認編譯時將許多標准庫采用內聯方式處理,如果沒有可以鏈接的標准庫文件,就要專門添加標准庫文件來鏈接標准庫中的函數。
解決方法:
1、在報錯的源文件添加編譯預處理指令
#pragma comment(lib, "legacy_stdio_definitions.lib")
2、在工程中配置
工程->右鍵屬性->鏈接器->輸入->附加依賴項 ,添加“legacy_stdio_definitions.lib”
待解決完這兩處編譯錯誤后,可以編譯生成EmptyProject.exe,一個藍色的窗口。 EmptyProject.exe可以在項目的debug目錄(D:\Program Files (x86)\Microsoft DirectX SDK (June 2010)\Samples\C++\Direct3D\EmptyProject\Debug)下找到
注意: vs2019要想編譯D:\Program Files (x86)\Microsoft DirectX SDK (June 2010)\Samples\C++\Direct3D 目錄下面的Direct3D例子, 是不能把這些例子程序文件的對應目錄拷貝到其他盤符路徑下去編譯的,
那樣會報錯,說找不到 D:\Program Files (x86)\Microsoft DirectX SDK (June 2010)\Samples\C++\DXUT\Core 下面的.h 和 .cpp 文件,或許還有其他文件也會找不到,因為編譯時, vs2019會到 ..\..\DXUT\Core 這樣的相對路徑下去找 需要鏈接的文件,所以例子程序最好放在D:\Program Files (x86)\Microsoft DirectX SDK (June 2010)\Samples\C++\Direct3D 目錄下面,其實是需要維持D:\Program Files (x86)\Microsoft DirectX SDK (June 2010)\Samples\C++ 這個目錄下面的Direct3D目錄和DXUT目錄的相對位置不變才行
ps:這里還搜集到一個有價值的報錯信息,但並不是該例子編譯鏈接是報的錯,但一並列在這個帖子里
編譯報錯說沒有dxerr9.h這個東西,原因是在早期的directX版本中的inlcude目錄中有這個dxerr9.h頭文件,但到了DX2010,include目錄中就沒這個頭文件了,其中定義應該都移動到了d3d9.h里面,因此老舊代碼要注釋掉這一行
