将SDL2与CMake一起使用

Ove*_*oek 18 c++ cmake sdl-2

我正在尝试使用CLion来创建一个SDL2项目.问题是使用#include时无法找到SDL标头.

我的CMakeLists.txt文件:

cmake_minimum_required(VERSION 2.8.4)
project(ChickenShooter)

set(SDL2_INCLUDE_DIR C:/SDL/SDL2-2.0.3/include)
set(SDL2_LIBRARY C:/SDL/SDL2-2.0.3/lib/x64)

include_directories(${SDL2_INCLUDE_DIR})
set(SOURCE_FILES main.cpp)

add_executable(ChickenShooter ${SOURCE_FILES})
target_link_libraries(ChickenShooter ${SDL2_LIBRARY})
Run Code Online (Sandbox Code Playgroud)

我的测试main.cpp:

#include <iostream>
#include "SDL.h" /* This one can't be found */

int main(){
    if (SDL_Init(SDL_INIT_VIDEO) != 0){
        std::cout << "SDL_Init Error: " << SDL_GetError() << std::endl;
        return 1;
    }
    SDL_Quit();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

谢谢你能给我的任何帮助.

编辑:我正在使用Windows,而CLion配置为使用cygwin64.

usr*_*567 18

不要手动设置SDL2的路径.使用使用FindSDL的正确find命令.应该是这样的:

find_file(SDL2_INCLUDE_DIR NAME SDL.h HINTS SDL2)
find_library(SDL2_LIBRARY NAME SDL2)
add_executable(ChickenShooter main.cpp)
target_include_directories(ChickenShooter ${SDL2_INCLUDE_DIR})
target_link_libraries(ChickenShooter ${SDL2_LIBRARY})    
Run Code Online (Sandbox Code Playgroud)

如果找不到SDL2,则必须将路径添加到SDL2 CMAKE_PREFIX_PATH,这是CMake查找已安装软件的位置.

如果你可以使用Pkg-config,它的使用可能会更容易,请参阅如何使用cmake使用SDL2和SDL_image

如果您觉得使用类似于CMake提供的FindSDL.cmake的FindSDL2.cmake文件感觉更舒服,请参阅https://brendanwhitfield.wordpress.com/2015/02/26/using-cmake-with-sdl2/

  • @charlesrockbass:感谢您的提示,它应该是find_package。 (2认同)
  • SDL与SDL2不同,默认的FindSDL.cmake不查找SDL2. (2认同)

tre*_*nki 14

这篇博客文章展示了如何做到这一点:将SDL2与CMake一起使用

在Linux上,您可以使用最近的CMake(例如版本3.7)并使用SDL2开箱即用.

cmake_minimum_required(VERSION 3.7)
project(SDL2Test)

find_package(SDL2 REQUIRED)
include_directories(SDL2Test ${SDL2_INCLUDE_DIRS})

add_executable(SDL2Test Main.cpp)
target_link_libraries(SDL2Test ${SDL2_LIBRARIES})
Run Code Online (Sandbox Code Playgroud)

在Windows下,您可以下载SDL2开发包,将其解压缩到某处,然后sdl-config.cmake在提取的位置创建一个文件,其中包含以下内容:

set(SDL2_INCLUDE_DIRS "${CMAKE_CURRENT_LIST_DIR}/include")

# Support both 32 and 64 bit builds
if (${CMAKE_SIZEOF_VOID_P} MATCHES 8)
  set(SDL2_LIBRARIES "${CMAKE_CURRENT_LIST_DIR}/lib/x64/SDL2.lib;${CMAKE_CURRENT_LIST_DIR}/lib/x64/SDL2main.lib")
else ()
  set(SDL2_LIBRARIES "${CMAKE_CURRENT_LIST_DIR}/lib/x86/SDL2.lib;${CMAKE_CURRENT_LIST_DIR}/lib/x86/SDL2main.lib")
endif ()

string(STRIP "${SDL2_LIBRARIES}" SDL2_LIBRARIES)
Run Code Online (Sandbox Code Playgroud)

现在,当您在CMake-GUI应用程序内部进行配置时,将会有一个SDL2_DIR变量.您必须将它指向SDL2目录,在该目录中解压缩dev包并重新配置,然后一切都应该工作.

然后,您可以通过编写来包含SDL2标头#include "SDL.h".

  • 只是为了补充这一点。查找包的配置文件的名称应该是 sdl2-config.cmake (2认同)

Tom*_*Tom 14

我最近发现最新版本的 SDL2(版本 2.0.12)现在附带了所有必需的 CMake 配置/安装脚本,因此无需再使用 FindSDL。

我从https://www.libsdl.org/download-2.0.php下载了 SDL 源代码,然后从根文件夹运行...

cmake -S . -B build/debug -G Ninja -DCMAKE_INSTALL_PREFIX=./install -DCMAKE_BUILD_TYPE=Debug
cmake --build build/debug --target install
Run Code Online (Sandbox Code Playgroud)

这将构建并安装库的调试版本,然后您还可以运行...

cmake -S . -B build/release -G Ninja -DCMAKE_INSTALL_PREFIX=./install -DCMAKE_BUILD_TYPE=Release
cmake --build build/release --target install
Run Code Online (Sandbox Code Playgroud)

这将构建并安装库的发布版本(并且由于 SDL CMake 脚本使用 DEBUG_POSTFIX,库的发布版本不会覆盖调试版本,因为调试版本的名称均附加有“d”)。

在您的 CMakeLists.txt 文件中,您可以简单地执行以下操作:

find_package(SDL2 REQUIRED)

add_executable(${PROJECT_NAME} ...)

target_link_libraries(
    ${PROJECT_NAME} PRIVATE
    SDL2::SDL2
    SDL2::SDL2main
Run Code Online (Sandbox Code Playgroud)

如果您像我在示例中所做的那样使用自定义位置,则需要告诉您的应用程序在哪里可以找到 SDL 安装文件夹。要从应用程序的根文件夹执行此操作,请运行:

find_package(SDL2 REQUIRED)

add_executable(${PROJECT_NAME} ...)

target_link_libraries(
    ${PROJECT_NAME} PRIVATE
    SDL2::SDL2
    SDL2::SDL2main
Run Code Online (Sandbox Code Playgroud)

注意:您可以使用$(pwd)(*nix/macOS) 或%cd%(Windows) 创建非常有用的混合相对路径。

如果您想将 SDL 安装到默认系统位置,则可以忽略两者DCMAKE_INSTALL_PREFIXDCMAKE_PREFIX_PATH

在示例中,我选择使用 Ninja 生成器,因为它在 macOS/Windows 上是一致的 - 它可以与 MSVC/Visual Studio 一起使用,只需确保运行它(路径可能会因年份/版本而略有不同)来添加忍者走上你的道路。

cmake -S . -B build/debug -G Ninja -DCMAKE_BUILD_TYPE=Debug -DCMAKE_PREFIX_PATH=</absolute/path/to/install/dir>
cmake --build build/debug
Run Code Online (Sandbox Code Playgroud)

更新:

我记得在 Windows 上有用的另一件事是能够将 SDL .dll 文件复制到应用程序二进制目录中,这可以通过以下方式实现:

if (WIN32)
# copy the .dll file to the same folder as the executable
add_custom_command(
    TARGET ${PROJECT_NAME} POST_BUILD
    COMMAND ${CMAKE_COMMAND} -E copy_if_different
    $<TARGET_FILE:SDL2::SDL2>
    $<TARGET_FILE_DIR:${PROJECT_NAME}>
    VERBATIM)
endif()
Run Code Online (Sandbox Code Playgroud)

  • 您可以使用 FetchContent 而不是您喜欢的 - 它的工作原理应该大致相同。这里有一些关于它的信息您可能会发现有用 - https://github.com/pr0g/cmake-examples/tree/main/examples/more/fetch-content。这是使用ExternalProject_Add添加SDL的示例(本质上自动执行上述步骤 - https://github.com/pr0g/sdl-bgfx-imgui-starter/blob/main/third-party/CMakeLists.txt) (3认同)

gen*_*ult 7

您还可以将 SDL 源存储库作为子模块引入,并通过add_subdirectory()和静态构建/链接它与您的主程序target_link_libraries()

cmake_minimum_required( VERSION 3.7.0 )
project( sdl2-demo )

set( SDL_STATIC ON CACHE BOOL "" FORCE )
set( SDL_SHARED OFF CACHE BOOL "" FORCE )
add_subdirectory( external/sdl )

add_executable(
    sdl2-demo
    "src/main.cpp"
    )
target_link_libraries( sdl2-demo SDL2main SDL2-static )
Run Code Online (Sandbox Code Playgroud)

(至少从release-2.0.9tag 开始,可能更早。)


小智 5

cmake_minimum_required(VERSION 2.8.4)

project(ChickenShooter)

set(SDL2_INCLUDE_DIR C:/SDL/SDL2-2.0.3/include/SDL2)
set(SDL2_LIB_DIR C:/SDL/SDL2-2.0.3/lib/x64)

include_directories(${SDL2_INCLUDE_DIR})
link_directories(${SDL2_LIB_DIR})

set(SOURCE_FILES main.cpp)

add_executable(${PROJECT_NAME} ${SOURCE_FILES})
target_link_libraries(${PROJECT_NAME} SDL2main SDL2)
Run Code Online (Sandbox Code Playgroud)