【问题标题】:Setup CMake with SFML in VS2017在 VS2017 中使用 SFML 设置 CMake
【发布时间】:2018-05-04 12:29:47
【问题描述】:

就像在 CLion 中一样,我想将 SFML 与 Visual 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()

那件事给了我错误:

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       

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

更新
这是我的位置....

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

【问题讨论】:

  • 该错误表示找不到SFML。您是否安装了 SFML?如果有,在哪里?
  • @Tsyvarev 正如我所说..所有库都在我提供的链接中的同一个文件夹 SFML 中,在它之外......是我的 main.cpp
  • 尝试将SFML_ROOT 设置为C:/Users/ramm32/Documents/SFML/(见下面我的回答)。这应该可以正常工作。

标签: c++ cmake visual-studio-2017 sfml


【解决方案1】:

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

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

  • 您的 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})

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

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

所以当你第一次调用 CMake 时,它​​可能看起来像这样:

cmake -G "Visual Studio 15 2017" -DSFML_ROOT=path/to/sfml path/to/source

【讨论】:

  • 您也可以将set CMAKE_CXX_STANDARD 作为-std=c++11 的便携式替代品。
  • @ComicSansMS 不错,是新的吗?不要以为我以前见过。更新答案。
  • 自 CMake 3.1 以来一直存在,但由于完善的解决方法,CMake 功能在一段时间内往往会被忽视。这就是为什么我喜欢不时指出更现代的替代方案。
  • DSFML 代表调试?以及我需要将哪些文件放在那里...我会更新问题
  • 似乎 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】:

这就是您在 cmake 项目中编译 sfml 所需的全部内容。

find_package(SFML 2.5.1 COMPONENTS system graphics audio network REQUIRED)
add_executable (AwesomeProject "AwesomeProject.cpp" "AwesomeProject.h")
target_link_libraries(AwesomeProject PRIVATE sfml-audio sfml-graphics sfml-network sfml-system)

还将 SFML_DIR var 设置为您的 sfml 文件夹。

【讨论】:

  • 感谢更新的答案,但这仍然缺乏信息
  • 你不需要提供你自己的 find_sfml.cmake 你需要的已经存在于 sfml 文件夹中。 find_package 可以查找该文件,您只需将 sfml_dir var 设置为 sfml 文件夹,以便 find_package 可以找到该 sfmlConfig.cmake。
猜你喜欢
  • 2020-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-16
  • 2015-03-30
  • 1970-01-01
  • 1970-01-01
  • 2023-04-02
相关资源
最近更新 更多