我知道以前曾经问过这个问题,但我对我在网上找到的答案不满意,所以希望有人可以为我提供正确的见解。
我试图在Windows上使用CLion配置SDL2,但我遇到了一些问题。我之前在linux上下载了SDL2源代码,成功构建并安装它们,所以我知道它有效。但是,我现在无法访问该计算机,而且我正试图在Windows上进行设置。
我已下载http://libsdl.org/release/SDL2-devel-2.0.7-mingw.tar.gz并将其内容提取到E:\SDL2\SDL2-2.0.7
(E:\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.
我知道这个错误是显而易见的,但为了完整起见我还是将它包括在内。
我有以下问题:
FindSDL2.cmake
文件进行搜索,对我来说似乎不太好.. 换句话说;什么是这个问题的一个漂亮,便携,最小的解决方案?请尽可能激励答案,我喜欢学习为什么这是一个很好的解决方案以及如何做到这一点。谢谢!
答案 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
中指定的目录,以及其中的子目录lib
和lib64
,用于名为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使用该位置的查找脚本。