探讨一下在 Windows11 系统中使用 VS2022 来编译 SFML 2.6 版本。
编译完成之后,我们可以使用 msvc 编译器,配合 cmake 在 VSCode 中去使用 C++ 来编写图形应用了。对于本身 SFML 的一些比如说跨平台的特性,那是自然不用说的。
本文主要分为两个部分,一个编译,另一个是使用 VSCode + CMake 创建一个示例程序并运行。
编译
具体的步骤如下:
1、从 GitHub 中克隆 2.6.x
分支的代码,

1
| git clone -b 2.6.x https://github.com/SFML/SFML.git
|
然后我们打开 CMake 的窗口程序,在 Where is the source code:
这里选择我们刚刚 clone 下来的 SFML 的目录,同时也配置一下这个 Where to build the binaries
,

然后点击 Configure
,然后会让我们选 Specify the generator for this project
,我们这里选择 Visual Studio 17 2022
,其他保持默认,然后点击 Finish
,
然后再点击 Configure
,执行完之后会有一些变红的参数,我们只需要把 CMAKE_INSTALL_PREFIX
设置成我们想把编译好的文件放置的地方即可,

然后,再点击 Configure
,此时就没有红色的参数了,这时,我们再点击 Generate
,

Generatings done
了之后,我们点击 Open Project
,就会在 VS2022 中打开项目了,
右键 INSTALL
,然后点击生成,等待编译完成即可,


这里编译了 23 秒钟就好了,

我们来看一下编译好的文件所在的目录的结构,

bin
目录里面放的都是 dll 文件,include
目录里面放的是头文件,如此等等。
创建 demo
先新建一个空目录,然后使用 VSCode 打开,然后 Ctrl + Shift + P
打开命令面板(Mac 中是 Command + Shift + P
),

然后选择一个编译器,下面的两个都可以,

然后,我们按一下 Esc
,那么,CMake 插件就会给我们自己创建一个 CMakeLists.txt
,

然后给项目取一个名字,我们这里就叫 SFMLDemo01
,

然后,把 CMakeLists.txt
中的内容换成如下的配置,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| cmake_minimum_required(VERSION 3.8) project("SFMLDemo01")
# 设置 SFML 目录 set(SFML_DIR "C:\\FDisk\\SFML\\lib\\cmake\\SFML")
find_package(SFML REQUIRED COMPONENTS audio network graphics window system)
if(NOT SFML_FOUND) message(FATAL_ERROR "SFML NOT FOUND!") else() message("SFML FOUND!") endif()
include_directories(${SFML_INCLUDE_DIR})
add_executable(SFMLDemo01 "main.cpp")
if(CMAKE_VERSION VERSION_GREATER 3.12) set_property(TARGET SFMLDemo01 PROPERTY CXX_STANDARD 20) endif()
target_link_libraries("SFMLDemo01" sfml-main sfml-audio sfml-network sfml-graphics sfml-window sfml-system)
# 把 DLL 复制到执行目录 set( DLL_FILES "C:\\FDisk\\SFML\\bin\\sfml-graphics-d-2.dll" "C:\\FDisk\\SFML\\bin\\sfml-window-d-2.dll" "C:\\FDisk\\SFML\\bin\\sfml-system-d-2.dll" ) foreach(DLL_FILE ${DLL_FILES}) message("Found DLL to Copy: ${DLL_FILE}") add_custom_command( TARGET SFMLDemo01 PRE_BUILD # 复制到 CMake 的二进制可执行文件的目录下,但是,在 Windows 中,要放到 Debug 子目录下 # 因为默认编译好的二进制文件是放到 ./build/Debug 目录下的 COMMAND ${CMAKE_COMMAND} -E copy ${DLL_FILE} ${CMAKE_BINARY_DIR}/Debug. ) endforeach()
|
然后,配置一下 C/C++
插件的一些属性,可以让我们在写代码的时候可以使用自动补全,尤其是头文件,下面的 .vscode
目录和 c_cpp_properties.json
都需要我们手动创建,

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| { "configurations": [ { "name": "SFML", "includePath": [ "${workspaceFolder}/**", "C:/Program Files/Microsoft Visual Studio/2022/Community/VC/Tools/MSVC/14.34.31933/include", "C:/FDisk/SFML/include" ], "defines": [ "UNICODE", "_UNICODE" ], "compilerPath": "C:/Program Files/Microsoft Visual Studio/2022/Community/VC/Tools/MSVC/14.34.31933/bin/Hostx64/x64/cl.exe", "cStandard": "c11", "cppStandard": "c++11", "intelliSenseMode": "msvc-x64", "configurationProvider": "ms-vscode.cmake-tools" } ], "version": 4 }
|
然后,把 main.cpp
替换成如下的代码,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| #include <SFML/Graphics.hpp>
using namespace std;
int main() { sf::RenderWindow window(sf::VideoMode(500, 500), "SFML works!", sf::Style::Default, sf::ContextSettings(0, 0, 8)); window.setFramerateLimit(60);
sf::CircleShape circle(220.f);
circle.setPosition(30.f, 30.f); circle.setFillColor(sf::Color::Green);
circle.setPointCount(3000);
while (window.isOpen()) { sf::Event event; while (window.pollEvent(event)) { if (event.type == sf::Event::Closed) window.close(); }
window.clear(); window.draw(circle); window.display(); }
return 0; }
|
之后,我们可以运行这个 demo 项目,

运行结果就是一个窗口里面绘制一个圆,

到这里就结束了。
参考:
1、https://segmentfault.com/a/1190000042050068