在Windows上使用sfml库开发图形应用【vscode+MinGW配置】
在linux系统上,使用sfml库非常轻松,
sudo apt install libsfml-dev
就够了,此后在编译时,需要在编译选项中指明所需要的库,g++ source.cpp -o target -lsfml-graphics
,此后就可以愉快地运行了。但是在windows上就复杂很多,由于笔者主要使用vscode进行开发,所以下文就介绍了如何配置vscode+sfml的开发环境。
下载sfml的库文件
这个是官方下载地址:SFML 2.6.1 (SFML / Download) (sfml-dev.org)
由于我使用的是MinGW编译器,所以选择了最后一行的GCC 13.1.0 MINGW(SEH) - 64bit
版本的sfml库。
下载对应版本的编译器
因为刚才下载的sfml库是由特定版本的编译器编译的,所以我们也需要使用一致版本的编译器编译我们的程序,这是下载地址:WinLibs MSVCRT 13.1.0 (64-bit)。下载并解压到你喜欢的位置,我把它解压到了C:\Program Files\mingw64
文件夹中,之后再把C:\Program Files\mingw64\bin
加入到系统路径中,以便其他地方使用。
在加入系统路径后,在控制台中输入g++ -v
,检查是否指向刚刚下载的编译器位置,如果你之前下的已经有一个编译器了,注意调整系统路径中两个编译器的先后顺序,或者直接删除此前旧版本的路径。
Vscode配置
Vscode只是一个“比较高级的”编辑器,它的最重要的功能是自动补全和智能分析,因此我们只用配置Intellisense的包含路径,使它包含刚刚下载的sfml库的include文件夹。由于我们直接把sfml库放到了工作区,所以Intellisense会自动搜索到sfml的头文件,也就不需要额外配置了。
方法一:使用Makefile编译
下图是我们工程的文件结构,我们只需要使用g++ test.cpp -g -o output/test -ISFML-2.6.1/include -LSFML-2.6.1/lib -lsfml-graphics -lsfml-window -lsfml-system -mwindows
命令即可得到可执行文件test.exe
,命令的最后一部分-mwindows
是为了指定应用为图形子系统,而不是控制台应用,因此这样得到的可执行文件在双击后不会出现控制台,而是直接为图形界面。
为了方便,我们把这段编译命令写道makefile文件中,此后只用输入mingw32-make.exe命令就能快速的编译了。
test : test.cpp
g++ test.cpp -g -o output/test -ISFML-2.6.1/include -LSFML-2.6.1/lib -lsfml-graphics -lsfml-window -lsfml-system -mwindows
注意:
- 由于编译出的可执行文件需要用到sfml的动态库,所以我们还需要把SFML-2.6.1/bin中的dll文件全部复制到生成的可执行文件的同级目录,此后才能正常运行。
- 如果你的程序需要用到一些资源,比如图片、字体等等,你需要妥善处理好这些资源文件的位置,在程序中最好使用绝对地址,否则,最好使用filesystem根据可执行文件的位置定位资源文件的相对位置。否则的话,这些文件很容易不能被程序找到。
有趣的地方在于,我发现如果把其他文件拖到可执行文件的图标上打开,这些文件的位置会在argv列表中传给程序的main函数,就像是在命令行加上参数调用一样。
方法二:使用CMake编译
有时候当项目变得复杂时,make工具就不太好用了,这时我们可以使用CMake来编译项目:
cmake_minimum_required(VERSION 3.15)
project(test LANGUAGES CXX)
set(CMAKE_CXX_FLAGS "-mwindows")
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/output)
set(SFML_DIR "SFML-2.6.1/lib/cmake/SFML")
find_package(SFML 2.5 REQUIRED COMPONENTS graphics)
link_libraries(sfml-graphics)
add_executable(test test.cpp)
此后就可以使用cmake.exe -S . -B build -G "MinGW Makefiles"
生成Makefile文件,再通过cmake.exe --build build
调用mingw-make.exe来构建文件了。同样的,一定要注意资源文件的位置和sfml的动态链接库的拷贝。
不过为了方便,我们可以直接用vscode的cmake扩展,它会帮我们一键构建和一键运行,非常奈斯~
附注
之前笔者学习sfml时,写了很多(自认为)蛮有趣的例子,如果各位不清楚该如何入手的话可以参考一下,这是我的代码地址:https://github.com/leehyukshuai/learn-sfml。