在 VS2017 中使用 SFML 设置 CMake

Ego*_*nn. 4 c++ cmake sfml visual-studio-2017

就像在 CLion 中我想使用SFMLVisual Studio 2017 中,但我仍在学习 cmake,我根本不知道 cmake 工作方式的命令或逻辑。我刚刚看到了一些帖子并得到了这个小脚本。

注意:我在提供的链接中下载了最新版本的 sfml,我只是将提取的目录放在我的文件夹中的 CMakeLists.txt 旁边

#sets up the minimum version of cmake
cmake_minimum_required(VERSION 3.9)

#how the project will be called
project (space_impact)

#set c++11 standard
set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}" -std=c++11)

#set source files
set (SOURCE_FILES main.cpp)

#we add the executable of the program
add_executable (space_impact ${SOURCE_FILES})

#taked from a mac-clion tutorial, doesn't work
set (CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/SFML/cmake-modules/")
find_package (SFML REQUIRED system window graphics network audio)
if (SFML_FOUND)
    include_directories(${SFML_INCLUDE_DIR})
    target_link_libraries(space_impact ${SFML_LIBRARIES})
endif()
Run Code Online (Sandbox Code Playgroud)

那件事给了我错误:

Error       CMake Error at SFML/cmake-modules/FindSFML.cmake:355 (message):
  Could NOT find SFML (missing: SFML_SYSTEM_LIBRARY SFML_WINDOW_LIBRARY
  SFML_GRAPHICS_LIBRARY SFML_NETWORK_LIBRARY SFML_AUDIO_LIBRARY)        SFML/cmake-modules/FindSFML.cmake       
Run Code Online (Sandbox Code Playgroud)

我希望一切都是动态的,但我不知道该怎么做。
所以我的问题是我应该怎么做才能在 Visual Studio 中使用 Cmake 正确设置 SFML
我不要官网的老式方法

更新
这是我的位置....
外部 里面

问题是......FindSFML.cmake脚本不起作用......
我应该移动哪些文件才能使其工作?

Mar*_*rio 5

您的脚本非常好,除了我要更改的三件事:

  • 定义目标之前移动整个模块检测。我很确定您之前还必须定义包含目录。

  • 您的if(SFML_FOUND)括号现在毫无意义,因为您已将 SFML 设置为必需,这意味着find_package()除非找到它,否则它将永远不会过去。

  • -std=c++11是仅 GCC 标志(除非指定,否则 MSVC 将始终使用最新标准)。因此,您必须在此处检查编译器或使用CMAKE_CXX_STANDARD.

所以“清理”CMakeLists.txt可能看起来像这样:

#sets up the minimum version of cmake
cmake_minimum_required(VERSION 3.9) # personally I'd set this version as low as required; you don't have to require the cutting edge version

#how the project will be called
project (space_impact)

#set the C++ standard to be used
set (CMAKE_CXX_STANDARD 11)

#set source files
set (SOURCE_FILES main.cpp)

#look for SFML and add it
set (CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/SFML/cmake-modules/")
find_package (SFML REQUIRED system window graphics network audio)

include_directories(${SFML_INCLUDE_DIR})

#we add the executable of the program
add_executable (space_impact ${SOURCE_FILES})
target_link_libraries(space_impact ${SFML_LIBRARIES} ${SFML_DEPENDENCIES})
Run Code Online (Sandbox Code Playgroud)

请注意,添加SFML_DEPENDENCIES到库列表是可选的,除非您使用的是静态版本的 SFML。

但是你的 SFML 问题呢?由于默认情况下您没有在任何目录中安装 SFML 文件,因此您必须使用 CMake 变量SFML_ROOT或同名环境变量告诉 CMake 在哪里找到它。

因此,您第一次调用 CMake 时,它​​可能如下所示:

cmake -G "Visual Studio 15 2017" -DSFML_ROOT=path/to/sfml path/to/source
Run Code Online (Sandbox Code Playgroud)

  • SFML 似乎转移到基于导入目标的新系统,因此上面的代码不再适用于 SFML 2.5.1。删除 `include_directories` 调用并将 `target_link_libraries` 替换为 `target_link_libraries(space_impact PUBLIC sfml-system sfml-window sfml-graphics sfml-network sfml-audio)` 以使其再次工作。 (2认同)