FindSDL

查找 SDL (Simple DirectMedia Layer) 库。SDL 是一个跨平台的库,用于开发多媒体软件,例如游戏和模拟器。

注意

此模块专门用于 SDL 版本 1。从版本 2 开始,SDL 在使用 CMake 构建时提供了一个 CMake 包配置文件,应该使用 find_package(SDL2) 来查找。同样,SDL 版本 3 可以使用 find_package(SDL3) 来查找。这些较新版本提供了独立的 导入目标 来封装使用要求。有关更多信息,请参阅官方 SDL 文档。

请注意,最近的 SDL 1 版本中 SDL 头文件的包含路径已从 SDL/SDL.h 更改为 SDL.h。此更改符合 SDL 使用 #include "SDL.h" 以实现可移植性的约定,因为并非所有系统都将头文件安装在 SDL/ 子目录中(例如 FreeBSD)。

当目标是 macOS 并且使用 SDL 框架时,请确保在项目中同时包含 SDLmain.hSDLmain.m。对于其他平台,SDLmain 库通常使用 -lSDLmain 进行链接,本模块将尝试自动找到它。此外,对于 macOS,本模块将根据需要添加 -framework Cocoa 标志。

导入的目标

此模块提供以下 导入目标

SDL::SDL

3.19 版本新增。

封装 SDL 库使用要求的目标,如果找到 SDL 则可用。

结果变量

此模块定义了以下变量

SDL_FOUND

布尔值,指示是否找到(请求版本的)SDL。

SDL_VERSION

3.19 版本新增。

包含找到的 SDL 版本的可读字符串。

SDL_VERSION_MAJOR

3.19 版本新增。

找到的 SDL 的主版本号。

SDL_VERSION_MINOR

3.19 版本新增。

找到的 SDL 的次版本号。

SDL_VERSION_PATCH

3.19 版本新增。

找到的 SDL 的补丁版本号。

SDL_INCLUDE_DIRS

3.19 版本新增。

使用 SDL 所需的包含目录。

SDL_LIBRARIES

3.19 版本新增。

链接使用 SDL 所需的库。

缓存变量

这些变量可以可选地设置,以帮助此模块找到正确的文件

SDL_INCLUDE_DIR

包含 SDL.h 头文件的目录。

SDL_LIBRARY

包含 SDL 库路径以及链接使用 SDL 所需的库的列表。

提示

此模块接受以下变量

SDL_BUILDING_LIBRARY

当设置为布尔值 true 时,SDL_main 库将从链接中排除,因为它在构建 SDL 库本身时不是必需的(只有应用程序需要 main() 函数)。如果未设置,此模块假定正在构建应用程序,并尝试在返回的 SDL_LIBRARY 变量中查找并包含适当的 SDL_main 链接标志。

SDLDIR

环境变量,可以设置该变量来帮助查找安装在自定义位置的 SDL 库。它应该指向配置、构建和安装 SDL 库时使用的安装目标:./configure --prefix=$SDLDIR

在 macOS 上,设置此变量会优先选择 Framework 版本(如果找到)而不是其他版本。在这种情况下,需要手动更改 SDL_LIBRARY 的缓存值来覆盖此选择,或设置 CMAKE_INCLUDE_PATH 变量来修改搜索路径。

故障排除

如果 SDL 库未自动找到,SDL_LIBRARY_TEMP 变量可能为空,并且 SDL_LIBRARY 将不会被设置。这通常意味着 CMake 无法找到 SDL 库(例如 SDL.dlllibSDL.soSDL.framework 等)。要解决此问题,请手动将 SDL_LIBRARY_TEMP 设置为正确的路径并重新配置项目。同样,如果 SDLMAIN_LIBRARY 未设置,也可能需要手动指定。这些变量用于构造最终的 SDL_LIBRARY 值。如果未设置它们,SDL_LIBRARY 将保持未定义。

已弃用变量

这些变量已过时,仅为向后兼容而提供

SDL_VERSION_STRING

自 3.19 版本起已弃用: 被具有相同值的 SDL_VERSION 取代。

如果找到 SDL,则包含其版本的可读字符串。

示例

查找 SDL 库并将其链接到项目目标

find_package(SDL)
target_link_libraries(project_target PRIVATE SDL::SDL)

在使用 SDL 版本 2 时,上游包直接提供 SDL2::SDL2 导入的目标。可以在不使用此模块的情况下在项目中使用它

find_package(SDL2)
target_link_libraries(project_target PRIVATE SDL2::SDL2)

同样,对于 SDL 版本 3

find_package(SDL3)
target_link_libraries(project_target PRIVATE SDL3::SDL3)

另请参阅