如何在cmake中使用SDL2和SDL_image

Car*_*ire 24 c++ sdl sdl-image cmake sdl-2

我在寻找编译使用C++程序最简单的方法SDL2SDL_image与cmake的.

经过几个小时的搜索后,这是我最好的尝试:

的CMakeLists.txt

project(shooter-cmake2)

cmake_minimum_required(VERSION 2.8)

set(SOURCES
shooter.cpp
classes.cpp
utils.cpp
)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x")

add_executable(${PROJECT_NAME} ${SOURCES})

INCLUDE(FindPkgConfig)
PKG_SEARCH_MODULE(SDL2 REQUIRED sdl2)
PKG_SEARCH_MODULE(SDL2_image REQUIRED sdl2_image)
INCLUDE_DIRECTORIES(${SDL2_INCLUDE_DIRS} ${SDL2IMAGE_INCLUDE_DIR})
TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${SDL2_LIBRARIES} ${SDL2IMAGE_LIBRARY})
Run Code Online (Sandbox Code Playgroud)

我收到这些错误:

In function `loadTexture(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, SDL_Renderer*)':
undefined reference to `IMG_LoadTexture'
collect2: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)

这是函数调用:

#include "SDL.h"
#include "SDL_image.h"

SDL_Texture* loadTexture(const std::string &file, SDL_Renderer *ren){
    SDL_Texture *texture = IMG_LoadTexture(ren, file.c_str());
    texture != nullptr or die("LoadTexture");
    return texture;
}
Run Code Online (Sandbox Code Playgroud)

我很绝望.请帮我!谢谢!:)

woj*_*iii 38

我认为以下内容可行,因为它在我的ubuntu系统上找到了库,并且您提供的示例函数可以链接:

project(shooter-cmake2)

cmake_minimum_required(VERSION 2.8)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x")

add_executable(${PROJECT_NAME} src/test.cpp)

INCLUDE(FindPkgConfig)

PKG_SEARCH_MODULE(SDL2 REQUIRED sdl2)
PKG_SEARCH_MODULE(SDL2IMAGE REQUIRED SDL2_image>=2.0.0)

INCLUDE_DIRECTORIES(${SDL2_INCLUDE_DIRS} ${SDL2IMAGE_INCLUDE_DIRS})
TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${SDL2_LIBRARIES} ${SDL2IMAGE_LIBRARIES})
Run Code Online (Sandbox Code Playgroud)

如果使用--debug-output执行cmake,则输出:

-- Found PkgConfig: /usr/bin/pkg-config (found version "0.26") 
Called from: [2]    /usr/share/cmake-2.8/Modules/FindPkgConfig.cmake
            [1] $USER/stack-overflow/cmake-sdl2-image/CMakeLists.txt
-- checking for one of the modules 'sdl2'
Called from: [1]    $USER/stack-overflow/cmake-sdl2-image/CMakeLists.txt
-- checking for one of the modules 'SDL2_image>=2.0.0'
Called from: [1]    $USER/stack-overflow/cmake-sdl2-image/CMakeLists.txt
Run Code Online (Sandbox Code Playgroud)

这让我检查了内容

/usr/lib/x86_64-linux-gnu/pkgconfig/sdl2.pc
/usr/lib/x86_64-linux-gnu/pkgconfig/SDL2_image.pc
Run Code Online (Sandbox Code Playgroud)

我注意到SDL2_image.pc包含Name:SDL2_image,我假设它应该匹配此库的PKG_SEARCH_MODULE的第三个参数.

  • 从CMake 3.1开始,`set(CMAKE_CXX_STANDARD yy)`比修改`CMAKE_CXX_FLAGS`更受欢迎. (2认同)

tre*_*nki 7

这里有两个关于此的博客文章:

将SDL2与CMake一起使用

在CMake中使用SDL2_image

基本上,您需要使用FindSDL2.cmakeand FindSDL2_image.cmake模块。它们可以基于已经包含在CMake中的SDL 1.2版本。使用这些查找模块在Windows上也可以使用。

如果您使用的是Linux,并且只需要SDL2,那么您甚至不需要,FindSDL2.cmake因为以下各项已经可以工作:

cmake_minimum_required(VERSION 3.7)

project(SDL2Test)

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

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


小智 5

我在回答这些问题时遇到了麻烦,我认为cmake改变了导入目标的方式。在@trenki博客文章之后,我需要将CMakeLists.txt更改为:

project(SDL2Test)
find_package(SDL2 REQUIRED COMPONENTS SDL2::SDL2)
add_executable(SDL2Test main.cpp)
target_link_libraries(SDL2Test SDL2::SDL2)
Run Code Online (Sandbox Code Playgroud)

目前,这在Arch Linux上是开箱即用的。


小智 5

我介绍了一种现代且可移植的方法来链接到 SDL2,SDL2_image。这些SDL2 CMake 模块可让您构建 SDL2 和 SDL2_image 项目,如下所示:

list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake/sdl2)

find_package(SDL2 REQUIRED)
find_package(SDL2_image REQUIRED)
target_link_libraries(${PROJECT_NAME} SDL2::Main SDL2::Image)
Run Code Online (Sandbox Code Playgroud)

您应该只在项目中克隆存储库:

list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake/sdl2)

find_package(SDL2 REQUIRED)
find_package(SDL2_image REQUIRED)
target_link_libraries(${PROJECT_NAME} SDL2::Main SDL2::Image)
Run Code Online (Sandbox Code Playgroud)

注意:如果 CMake 没有找到 SDL2/SDL2_image 库(在 Windows 中),我们可以指定 CMake 选项,SDL2_PATH如下SDL2_IMAGE_PATH所示:

git clone https://github.com/aminosbh/sdl2-cmake-modules cmake/sdl2
Run Code Online (Sandbox Code Playgroud)

它还支持其他相关库:SDL2_ttf、SDL2_net、SDL2_mixer 和 SDL2_gfx。有关更多详细信息,请阅读README.md文件。

您可以在此处找到使用这些模块的示例/样本和项目的列表: https: //github.com/aminosbh/sdl-samples-and-projects