使用CMion上的CMakeList.txt以一种漂亮,可移植的方式配置SDL2

时间:2018-02-16 00:30:24

标签: c++ cmake sdl-2 clion

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

我试图在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,我假设所有内容都是预先构建的(?)

这是CMakeList.txt中我的CLion项目(名为SDL_Project)中的E:\repository\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所在的位置。
  5. 换句话说;什么是这个问题的一个漂亮,便携,最小的解决方案?请尽可能激励答案,我喜欢学习为什么这是一个很好的解决方案以及如何做到这一点。谢谢!

1 个答案:

答案 0 :(得分:2)

查找库很复杂,即使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的库文件(在除了上述始终搜索的默认路径之外。

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

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

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