web-dev-qa-db-fra.com

Comment utiliser SDL2 et SDL_image avec cmake

Je cherche le moyen le 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:

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

Je reçois 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 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! :)

21
Carl Lemaire

Je pense que ce qui suit va fonctionner, car il trouve les bibliothèques sur mon système Ubuntu et la fonction exemple que vous avez fournie peut être liée:

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 --debug-output, il génère:

-- 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 fait 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 Je suppose que le troisième paramètre doit correspondre à PKG_SEARCH_MODULE pour cette bibliothèque.

33
wojciii

Il y a deux articles de blog à ce sujet ici:

Utilisation de SDL2 avec CMake

Utilisation de SDL2_image avec CMake

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

Si vous utilisez Linux et que vous n’avez besoin que de SDL2, vous n’avez même pas besoin du FindSDL2.cmake, car cela fonctionne déjà:

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

J'avais des problèmes avec ces réponses, je pense que cmake a changé la manière d'importer les cibles. Après le billet de blog de @trenki, je devais changer mon CMakeLists.txt en:

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

Actuellement, cela fonctionne hors de la boîte sur Arch Linux.

2
Charles

J'ai introduit une approche moderne et portable pour la liaison au SDL2, SDL2_image. Ces modules SDL2 CMake vous permettent de construire un projet SDL2 & SDL2_image comme suit:

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)

Vous devriez simplement cloner le repo dans votre projet:

git clone https://github.com/aminosbh/sdl2-cmake-modules cmake/sdl2

Remarque: Si CMake n'a pas trouvé les bibliothèques SDL2/SDL2_image (sous Windows), nous pouvons spécifier les options CMake SDL2_PATH et SDL2_IMAGE_PATH comme suit:

cmake .. -DSDL2_PATH="/path/to/sdl2" -DSDL2_IMAGE_PATH="/path/to/sdl2-image"

Il prend également en charge d'autres bibliothèques associées: SDL2_ttf, SDL2_net, SDL2_mixer et SDL2_gfx. Pour plus de détails, veuillez lire le fichier README.md .

Vous trouverez une liste d’exemples/exemples et de projets utilisant ces modules ici: https://github.com/aminosbh/sdl-samples-and-projects

0
aminosbh

Les commandes suivantes fonctionnent bien pour moi:

set(SDL_INCLUDE_DIR "/usr/include/SDL2")
set(SDL_LIBRARY "SDL2")
include(FindSDL)  

if(SDL_FOUND)  
  message(STATUS "SDL FOUND")
endif()
0
adem