之前写过一篇Clion
配置C++/SFML
开发环境(Win10
),由于Clion
是收费的IDE
,免费的IDE
目前靠谱的选择只有Visual Studio
,因此再写一篇基于Visual Studio 2022
的教程。由于SFML
未提供编译好的基于Visual Studio 2022
的版本,因此这里需要自己编译。
操作系统: windows 10 版本 1909 (内部版本 18363.1646)
IDE: Microsoft Visual Studio Community 2022 (64 位) 版本 17.2.5
CMake: cmake-gui 3.24.0-rc2
SFML: 2.6.x (Github源码编译)
从Github
下载2.6.x
分支的SFML
源码
打开CMake-gui
,如图所示,选择下载好SFML
源代码目录,任意设置一个build
目录,然后点击Configure
选择Visual Studio 2022
作为generator
,点击Finish
此时Configure
开始执行,执行完(Configuring done
)成会出现红色的参数需要设置,如下图所示,一般都不用改,我这里把CMAKE_INSTALL_PREFIX
改成另一个指定的目录,然后再次点击Configure
第二次Configure
完成之后,不再有红色参数,点击旁边的Generate
,执行完成后,点击Open Project
此时会打开Visual Studio 2022
,执行INSTALL
-> 生成,即可把SFML
安装在指定的目录。
通过Visual Studio 2022
再新建一个CMake
项目,CMakeLists.txt
内容如下
cmake_minimum_required (VERSION 3.8)
project("SFMLTest")
# 设置SFML目录
set(SFML_DIR "D:\\Program Files\\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 (SFMLTest "SFMLTest.cpp" "SFMLTest.h")
if (CMAKE_VERSION VERSION_GREATER 3.12)
set_property(TARGET SFMLTest PROPERTY CXX_STANDARD 20)
endif()
target_link_libraries("SFMLTest" sfml-main sfml-audio sfml-network sfml-graphics sfml-window sfml-system)
# 把DLL复制到执行目录
set(
DLL_FILES
"D:\\Program Files\\SFML\\bin\\sfml-graphics-2.dll"
"D:\\Program Files\\SFML\\bin\\sfml-window-2.dll"
"D:\\Program Files\\SFML\\bin\\sfml-system-2.dll"
)
foreach(DLL_FILE ${DLL_FILES})
message("Found DLL to Copy: ${DLL_FILE}")
add_custom_command(
TARGET SFMLTest PRE_BUILD
COMMAND ${CMAKE_COMMAND} -E copy ${DLL_FILE} ${CMAKE_BINARY_DIR}.
)
endforeach()
测试以下代码,执行成功将绘制一个绿色的圆
#include <SFML/Graphics.hpp>
using namespace std;
int main()
{
sf::RenderWindow window(sf::VideoMode(200, 200), "SFML works!");
sf::CircleShape shape(100.f);
shape.setFillColor(sf::Color::Green);
while (window.isOpen())
{
sf::Event event;
while (window.pollEvent(event))
{
if (event.type == sf::Event::Closed)
window.close();
}
window.clear();
window.draw(shape);
window.display();
}
return 0;
}
运行成功