Monday, December 27, 2021

教小朋友编程之坦克大战 2

加声音并不难,最简单的办法是直接调用SDL的mixer API(需要package libSDL2_mixer-devel),参见forked的Tanks,已经加入开始,开火和击中的声音,各自用独立的channel,好处是同一声音不会overlap。

So far有点跑偏了,原因是我打算先完成Windows下的c++ code,然后port到Python的Pygame上

前面讲到,在cygwin下编译出来的可执行文件,需要依赖X server来render graphics,不是很方便。所以我想直接编译成Windows的图形界面,那么就需要用Visual Studio了,同时要设置Windows下的SDL环境。关于Windows下的SDL,可参见David的how-to-install-sdl2-in-visual-studio,主要是要下载SDL的Windows开发库,包括SDL2 core, ttf(字体), mixer(声音)和image(图像)支持,我只下载了x64 binary,目前最新的是:

我不想安装庞大的VC,也不需要VC的IDE,所以准备只安装VC的Build Tools,甚至不需要Windows SDK,因为根据SDL的文档,它没有其余的dependency。VC Build Tools选择如下:

如果像上图中所有的Optional都清空,只需要2.66GB的空间,可以运行msbuild命令,但是不能运行nmake。运行环境setup通常会看到:'C:\Program' is not recognized as an internal or external command, operable program or batch file. 一方面是空格引起的错误,另一方面环境设置文件如vcvars64.bat并未安装。参见微软文档,需要安装至少一个build环境,如上图的最新MSVC v143 - VS2022 C++ x64/x86 build t..,会额外增加1.6GB的空间。这样环境设置批处理文件都会被安装,不过运行时还会看到The system cannot find the file specified,应该可以忽略。现在可以运行nmake了,需要修改Makefile加入nmake setting,另一个选项是用CMake生成新Makefile。

CMake是Open-Source Cross-Platform Make, 支持Linux,Windows和MacOS。在VS Code中可安装CMake(用来编辑CMakeLists.txt)和CMake Tools(微软为VS Code定制的CMake extension)。如果不用微软的CMake Tools, 也可以直接创建CMake task(参见https://www.40tude.fr/compile-cpp-code-with-vscode-cmake-nmake,需要保证环境变量Path里有CMake的路径)。在用微软的CMake Tools时,我遇到了:

[proc] Executing command: "C:\Program Files\CMake\bin\cmake.EXE" --no-warn-unused-cli -DCMAKE_EXPORT_COMPILE_COMMANDS:BOOL=TRUE -Hc:/w/Tanks -Bc:/w/Tanks/build -G "Visual Studio 17 2022" -T host=x64 -A win32
[cmake] Not searching for unused variables given on the command line.
[cmake] -- Selecting Windows SDK version  to target Windows 10.0.19044.
[cmake] -- The C compiler identification is unknown
[cmake] -- The CXX compiler identification is unknown
[cmake] CMake Error at CMakeLists.txt:3 (project):
[cmake]   No CMAKE_C_COMPILER could be found.

可是MSVC v143已经安装了!CMakeOutput.log显示:

cannot open input file 'kernel32.lib'

这个kernel32.lib应该是从Windows SDK来的,难道必须安装这个庞大的SDK?这个missing lib看起来和上面的No CMAKE_C_COMPILER好像没关联?还是先试试法国人的CMake task吧(我加了 "group": "build",这样就不用"alt-t"=>选task,直接"ctrl-shift-b"=>选build。同样有错:

CMake Error: Could not create named generator 

可是task里已经设了:-G 'NMake Makefiles'。Debug了半天,原来是双引号惹的祸,而且args应该是给list,所以args line应该像这样:

            "args": ["-G \"NMake Makefiles\"", "-DCMAKE_BUILD_TYPE=Debug", ".."],

另外NMake Makefiles不支持toolset设置,如: -T host=x64 -A win32

如果看到错误:

CMake Error at CMakeLists.txt:3 (project):
  Running
   'nmake' '-?'
  failed with:
   The system cannot find the file specified

这是因为没有运行Visual Studio的环境变量设置,VS code找不到nmake可执行文件。

为了绕开诸多麻烦,我直接改了Makefile用cl直接build,然后就遇到问题:

 fatal error C1083: Cannot open include file: 'stddef.h': No such file or directory

 网上一查,Introducing the Universal CRT http://blogs.msdn.com/b/vcblog/archive/2015/03/03/introducing-the-universal-crt.aspx
"The headers, sources, and libraries are now distributed as part of a separate
Universal CRT SDK. This SDK is included with Visual Studio; it is installed by
default to C:\Program Files (x86)\Windows Kits\10."。看来还是必须安装Windows SDK,最新的Windows 11 SDK, another 2.27GB。装了Windows Kits(SDK)后,至少微软的CMake Tools可以成功生产build file。

@Update on Dec 29, 2021: 一番折腾后终于搞定CMake, 虽然不够完美。CMakeLists.txt文件已经push到forked的Tanks。上面提到的下载的SDL库和头文件要重新安排目录结构,排成和Linux的一样,就不需要改动任何源程序了,然后把所有的SDL文件放在根目录下SDL子目录,这样Makefile就可以用相对目录了。用CMake/NMake build:

  1. cd build
  2. cmake -G "NMake Makefiles" ..
  3. nmake
  4. manually copy all SDL dll file to build/out
  5. All done. Just run: build/out/tanks.exe


0 Comments:

Post a Comment