【问题标题】:Configure SDL2 with CMakeList.txt on CLion in a nice, portable way在 CLion 上使用 CMakeList.txt 以一种不错的可移植方式配置 SDL2
【发布时间】:2018-02-16 00:30:24
【问题描述】:

我知道以前有人问过这个问题,但我对我在网上找到的答案不满意,所以希望有人可以为我提供正确的见解。

我正在尝试在 Windows 上使用 CLion 配置 SDL2,但遇到了一些问题。我之前在 linux 上下载了 SDL2 源,成功构建并安装了它们,所以我知道它可以工作。但是,我现在无法访问那台计算机,我正在尝试在 Windows 上进行设置。


我下载了http://libsdl.org/release/SDL2-devel-2.0.7-mingw.tar.gz 并将其内容提取到E:\SDL2\SDL2-2.0.7E:\SDL2\SDL2-2.0.7\x86_64-w64-mingw32\bin 包含SDL2.dll)。我发现的任何指南都没有说明运行 configure、cmake、make 或其他任何内容,并且由于它包含一个 DLL,我假设一切都是预先构建的 (?)

这是我在E:\repository\SDL_Project 中的 CLion 项目中的 CMakeList.txt(名为 SDL_Project):

cmake_minimum_required(VERSION 3.6)
project(SDL_Project)

set(CMAKE_CXX_STANDARD 14)

add_executable(SDL_Project src/main.cpp)

find_package(SDL2 REQUIRED)
find_package(SDL2_image REQUIRED)
find_package(SDL2_ttf REQUIRED)

include_directories(${SDL2_INCLUDE_DIR}
        ${SDL2_IMAGE_INCLUDE_DIR}
        ${SDL2_TTF_INCLUDE_DIR})

target_link_libraries(SDL_Project ${SDL2_LIBRARY}
        ${SDL2_IMAGE_LIBRARIES}
        ${SDL2_TTF_LIBRARIES})

仅此一项不起作用,因为 CMake 不知道在哪里寻找 SDL2(这与我的 Linux 经验不同。)

我在网上找到了几个版本的FindSDL2.cmake,显然这些是在不同位置搜索 SDL2 的巨大脚本。

CMakeList.txt 旁边添加此脚本对我不起作用:

CMake Error at CMakeLists.txt:8 (find_package):
  By not providing "FindSDL2.cmake" in CMAKE_MODULE_PATH this project has
  asked CMake to find a package configuration file provided by "SDL2", but
  CMake did not find one.

[...]

我还通过控制面板在Windows系统环境变量中将SDL2目录添加到PATH

这是我的编译器消息(当我注释掉 CMakeList.txt 中导致错误的 SDL2 行时):

E:\repository\SDL_Project\src\main.cpp:1:17: fatal error: SDL.h: No such file or directory
 #include <SDL.h>
                 ^
compilation terminated.

我知道这个错误很明显,但为了完整起见,我还是把它包括在这里。


我有以下问题:

  1. 如何以干净的方式为 Windows 正确设置它(将 SDL2 添加到 System32 对我来说似乎不太好..)
  2. 我想使用完全相同的 CMakeList.txt 文件从多台机器(linux、Windows..)构建,因此理想情况下,它不包含硬编码路径或特定于操作系统的代码或配置。
  3. 使用包含大量硬编码位置列表的大型 FindSDL2.cmake 文件进行搜索,这对我来说似乎也不太好..
  4. 理想情况下,设置构建环境所需的配置最少; a) 克隆存储库,b) 下载/解压缩 SDL2,c) 以某种方式告诉编译器 SDL2 的位置。

换句话说;什么是这个问题的一个好的、便携的、最小的解决方案?请尽可能激发答案,我想了解为什么这是一个很好的解决方案以及如何做到这一点。谢谢!!

【问题讨论】:

  • Adding this script next to CMakeList.txt does not work for me: - 仔细阅读错误信息:CMake希望在CMAKE_MODULE_PATH中列出的目录下找到一个脚本,因此您需要调整此变量以使用该脚本: list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}")。至于提示脚本在您的系统上的 SDL2 位置,请检查脚本的描述(在文件 FindSDL2.cmake 的开头)。或set CMAKE_PREFIX_PATH variable,在大多数情况下都有效。
  • SDL2 支持 CMake (github.com/davidsiaw/SDL2),所以让我们将 SDL2 集成为 CMake 子项目 cf crascit.com/2015/07/25/cmake-gtest
  • @MizuxDev 我无法让它工作..如果你有时间,你可以发布 CMake 文件作为答案吗?如果没有,哦,好吧,我设法使用下面的答案让它工作。谢谢!

标签: c++ cmake sdl-2 clion


【解决方案1】:

查找库很复杂,尽管 Unix 非常努力地欺骗您认为它不是。

最后,库只是文件系统上的一个文件(文件系统上的任何地方),您需要以某种方式告诉您的构建脚本在哪里查找该文件。 Unix 在这里带有许多合理的默认值(例如/usr/lib/),而 Windows 没有这些默认值,但是一旦您将库安装到非标准位置,Unix 上的情况就会与 Windows 上一样糟糕。

CMake 有 two answers to this problem,但在 SDL2 的情况下,可以说更合适的是使用查找脚本。

现在的 find 脚本应该解决查找可能位于文件系统上任何位置的库文件的问题。可能有一些合理的默认值,它会自动检查以方便您,但最终,如果没有您的帮助,它无法完成工作,因为文件可能在任何地方

这就是为什么,如果我们查看a typical find script,它总是会为您提供一个自定义点,告诉构建系统在哪里可以找到相关库:

FIND_LIBRARY(SDL2_LIBRARY_TEMP
  NAMES SDL2
  HINTS
  $ENV{SDL2DIR}
  PATH_SUFFIXES lib64 lib
  PATHS ${SDL2_SEARCH_PATHS} ${SDL2_INCLUDE_DIR}/../..
)

请注意此处的HINTS $ENV{SDL2DIR}。这个will make CMake search在环境变量SDL2DIR中指定的目录,以及其中的子目录liblib64,对于一个名为SDL2的库文件(除了前面提到的总是搜索的默认路径)¹。

请注意,这是特定于机器的提示,因此该目录有意不在任何脚本中硬编码,而是从环境变量中检索。这样,构建脚本本身保持完全可移植性,用户有责任相应地配置构建环境。

因此,您的设置过程是:获取您喜欢的库的二进制文件(通过下载二进制文件或自己构建),将其安装到您选择的位置,然后以某种方式使该库位置知道构建,例如。通过在构建外壳中设置环境变量。请注意,此过程对于所有平台始终相同,如果您的库已安装在查找机制识别的默认位置,例如 Unix 上的 /usr/lib 或 CMake 包注册表窗户。

还有一个细节缺失。无论是使用外部查找脚本还是包配置文件来查找库,CMake 还必须能够找到那个脚本,然后才能继续搜索库。同样,CMake 已经提供了 a bunch of preinstalled scripts 以方便您使用,但 SDL2 不是其中之一。幸运的是,如果您必须提供自己的查找脚本,您通常只需将其放在源代码树中,因此让 CMake 知道其位置不是问题。例如,如果您将 FindSDL2.cmake 放在项目源根目录下的文件夹 cmake 中,只需调用 list(APPEND CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake") 让 CMake 使用该位置的查找脚本。

¹ 请注意,since CMake 3.12 find_package(Foo) 自动将 Foo_ROOT 环境变量视为所有相关 find_* 调用的搜索提示,除非脚本使用 NO_PACKAGE_ROOT_PATH 选项明确选择退出该行为。

【讨论】:

  • 我仍然认为拥有如此巨大的 非标准 FindSDL2.cmake 文件有点尴尬,但您澄清了很多关于设置构建环境的工作原理。我设法通过设置SDL2DIR 环境变量让它工作。谢谢!
猜你喜欢
  • 1970-01-01
  • 2021-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多