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! :)
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.
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})
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.