在读完红龙书《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里面,因此老旧代码要注释掉这一行