使用SFML库构建CMake项目

3
我不明白如何使用CMakeLists.txt文件来构建SFML项目, 请问您有时间帮忙吗?谢谢!
详情: 我从官方网站https://www.sfml-dev.org/index.php下载了SFML库,并将其移到了我的项目根目录下(请参见下面的屏幕截图),编写了使用SFML的C++代码,然后输入了这个cmake命令:
.../test_proj> cmake -G "Ninja" .

但是在控制台输出中,我得到了这个:
CMake Warning at subdir_02/CMakeLists.txt:5 (find_package):
  By not providing "FindSFML.cmake" in CMAKE_MODULE_PATH this project has
  asked CMake to find a package configuration file provided by "SFML", but
  CMake did not find one.

  Could not find a package configuration file provided by "SFML" with any of
  the following names:

    SFMLConfig.cmake
    sfml-config.cmake

  Add the installation prefix of "SFML" to CMAKE_PREFIX_PATH or set
  "SFML_DIR" to a directory containing one of the above files.  If "SFML"
  provides a separate development package or SDK, be sure it has been
  installed.


-- Configuring done
-- Generating done
-- Build files have been written to: C:/Users/tim/Documents/c-c++/test_proj

CMakeLists.txt:

add_executable(subdir_02 main.cpp)

set(SFML_STATIC_LIBRARIES TRUE)

find_package(SFML COMPONENTS window graphics system)

target_compile_features(subdir_02 PUBLIC cxx_std_17)
target_compile_definitions(subdir_02 PRIVATE SFML_STATIC)

target_link_libraries(subdir_02 ${SFML_LIBRARIES} ${SFML_DEPENDENCIES})

这是使用SFML的主要C++文件(它在项目子文件夹中)。
.../test_proj/subdir_02/main.cpp:

#include <SFML/Graphics.hpp>

int main() {
    sf::RenderWindow app(sf::VideoMode(800, 600, 32), "Hello World - SFML");

    return 0;
}

截图

项目根目录截图

SFML文件夹截图

main.cpp-源文件夹


按照错误提示做。CMake不会猜测您是否将SFML作为项目的子目录。 - drescherjm
drescherjm,是的,你说得完全正确。但我不知道我需要在FindSFML.cmake文件或其他地方写什么 :) - Life Sweetener
1个回答

4
当您的CMakeLists.txt使用find_package()发现依赖项时,请将其安装文件夹添加到CMAKE_PREFIX_PATH,然后调用CMake配置。对于您的项目,CMake配置应该是:
cmake -S . -B build_release -DCMAKE_BUILD_TYPE=Release -DCMAKE_PREFIX_PATH="C:\Users\tim\Documents\c-c++\test_proj\SFML" -G "Ninja"

事实上,SFML包提供了一个CMake配置文件SFMLConfig.cmake在一个子目录下。这可能是find_package(SFML)正在寻找的文件。CMake无法知道这个文件在哪里,因此它会查找列在CMAKE_PREFIX_PATH中的每个路径下的一些特定子目录,最终会查找一些标准系统路径。
实际上,搜索过程可能非常复杂(https://cmake.org/cmake/help/latest/command/find_package.html#config-mode-search-procedure),但对于本地构建来说,CMAKE_PREFIX_PATH是您的好友。


哦,耶,谢谢你,SpacePotatoes!我会试一下的。 - Life Sweetener
我遇到了一个新的错误,与SFML版本不匹配有关: 找不到与请求版本“”兼容的软件包“SFML”的配置文件。考虑了以下配置文件但未被接受:C:/Users/tim/Documents/c-c++/test_proj/SFML/lib/cmake/SFML/SFMLConfig.cmake,版本:2.5.1(32位) - Life Sweetener
你是对的,SpacePotatoes,关于那个变量 CMAKE_PREFIX_PATH!它找到了SFML,但出现了新的“版本困难”。 - Life Sweetener
你是否下载了一个针对与你目标相同的操作系统/架构构建的SFML软件包? - SpacePotatoes
不,我没有,SpacePotatoes。好的,我要下载另一个! - Life Sweetener
啊啊啊啊啊!谢谢你,SpacePotatoes!你是最棒的!一切都解决了! :) 我为我的系统下载了另一个SFML包,并手动添加了SFML库:target_include_directories(subdir_02 PUBLIC "C:/Users/tim/Documents/c-c++/test_proj/SFML/include"), target_link_libraries(subdir_02 sfml-system sfml-window sfml-graphics ${SFML_DEPENDENCIES})现在它可以工作了!!谢谢你们!!!(感谢SpacePotatoes!)我很高兴。祝你好运 :) - Life Sweetener

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接