Comment utiliser SDL2 et SDL image avec cmake

je cherche la façon la plus simple de compiler un programme c++ en utilisant SDL2 et SDL_image avec cmake.

Voici ma meilleure tentative, après des heures de recherche de:

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})

j'obtiens ces erreurs:

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

Voici l'appel de la fonction:

#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;
}

je suis désespéré. S'il vous plaît aidez-moi! Merci! :)

20
demandé sur Carl Lemaire 2014-05-25 03:02:13

3 réponses

je pense que le travail, qu'il trouve les bibliothèques sur mon système ubuntu et l'exemple de la fonction vous fourni le lien:

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})

Si cmake est exécuté avec l'option --debug-sortie sorties:

-- 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

Cela m'a permis de vérifier le contenu de

/usr/lib/x86_64-linux-gnu/pkgconfig/sdl2.pc
/usr/lib/x86_64-linux-gnu/pkgconfig/SDL2_image.pc

j'ai remarqué que SDL2_image.pc contient Nom: SDL2_image ce que j'ai supposé devrait correspondre au troisième paramètre de PKG_SEARCH_MODULE pour cette bibliothèque.

30
répondu wojciii 2014-05-26 09:12:46

il y a deux billets de blog à ce sujet ici:

utilisation de SDL2 avec CMake

utilisation de SDL2_image avec CMake

Fondamentalement, vous avez besoin d'un FindSDL2.cmake et FindSDL2_image.cmake module. Ils peuvent être basés sur ceux qui fonctionnent pour SDL 1.2 qui sont déjà inclus dans CMake. L'utilisation de ces modules Find fonctionne également sous Windows.

si vous êtes sous Linux et que vous n'avez besoin que de SDL2, vous n'avez même pas besoin de FindSDL2.cmake comme le suivant déjà fonctionne:

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})
3
répondu trenki 2017-07-04 08:26:04

j'avais des problèmes avec ces réponses, je pense que cmake a changé la façon d'importer des cibles. Après le billet du blog @trenki, j'ai dû changer mes listes de macaques.txt:

project(SDL2Test)
find_package(SDL2 REQUIRED COMPONENTS SDL2::SDL2)
add_executable(SDL2Test main.cpp)
target_link_libraries(SDL2Test SDL2::SDL2)

actuellement cela fonctionne à partir de la boîte sur Arch Linux.

1
répondu Charles 2018-08-07 09:40:50