web-dev-qa-db-fra.com

Utiliser SDL2 avec CMake

J'essaie d'utiliser CLion pour créer un projet SDL2 . Le problème est que les en-têtes SDL sont introuvables lorsque vous utilisez # include.

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

Mon test 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;
}

Merci pour toute aide que vous pourriez me donner.

Edit: J'utilise Windows et CLion est configuré pour utiliser cygwin64.

15
Ovenkoek

Ne définissez pas le chemin d'accès à SDL2 manuellement. Utilisez la commande de recherche appropriée qui utilise FindSDL . Devrait ressembler à:

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

Si SDL2 n'est pas trouvé, vous devez ajouter le chemin d'accès à SDL2 à CMAKE_PREFIX_PATH, c'est l'endroit où CMake recherche les logiciels installés.

Si vous pouvez utiliser Pkg-config, son utilisation pourrait être plus facile, voir Comment utiliser SDL2 et SDL_image avec cmake

Si vous préférez utiliser un fichier FindSDL2.cmake similaire à FindSDL.cmake fourni par CMake, voir https://brendanwhitfield.wordpress.com/2015/02/26/using-cmake-with-sdl2/

16
usr1234567

Cet article de blog montre comment vous pouvez le faire: Utilisation de SDL2 avec CMake

Sous Linux, vous pouvez utiliser une version récente de CMake (par exemple, la version 3.7) et utiliser SDL2 est une solution immédiate.

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

Sous Windows, vous pouvez télécharger le package de développement SDL2, l'extraire quelque part, puis créer un fichier sdl-config.cmake à l'emplacement extrait avec le contenu suivant:

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)

Lorsque vous configurez maintenant dans l'application CMake-GUI, il y aura une variable SDL2_DIR. Vous devez le diriger vers le répertoire SDL2 où vous avez extrait le package dev et reconfigurer, puis tout devrait fonctionner.

Vous pouvez ensuite inclure les en-têtes SDL2 en écrivant simplement #include "SDL.h".

10
trenki

Vous ne semblez pas avoir d'erreur CMake lors de la génération de votre fichier make. Mais je pense que votre problème est que l’en-tête SDL se trouve dans un sous-dossier nommé "SDL2".

Changez votre CMakeLists.txt pour inclure

C:/SDL/SDL2-2.0.3/include/SDL2

Au lieu de

C:/SDL/SDL2-2.0.3/include
1
jordsti

En utilisant le module SDL2 CMake que j'ai développé, vous pouvez facilement intégrer la bibliothèque SDL2 dans une approche moderne et portable.

Vous devez simplement copier le module dans cmake/sdl2 (ou simplement cloner le référentiel de modules) dans votre projet:

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

Ajoutez ensuite les lignes suivantes dans votre fichier CMakeLists.txt:

list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake/sdl2)
find_package(SDL2 REQUIRED)
target_link_libraries(${PROJECT_NAME} SDL2::Main)

Remarque: Si CMake n'a pas trouvé la bibliothèque SDL2 (sous Windows), nous pouvons spécifier l'option CMake SDL2_PATH comme suit:

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

Pour plus de détails, veuillez lire le fichier README.md .

Les modules SDL2 CMake prennent en charge d'autres bibliothèques associées: SDL2_image, SDL2_ttf, SDL2_mixer, SDL2_net et SDL2_gfx.

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

1
aminosbh

Soulignant les étapes de la manière dont j'ai finalement pu accomplir cela à l'aide du module FindSDL2.cmake:

  • Téléchargez SDL2-devel-2.0.9-VC.Zip (ou une version quelconque après la publication de cette réponse) dans la section Bibliothèques de développement de la page de téléchargement.
  • Extrayez le dossier Zip et vous devriez voir un dossier semblable à "SDL2-2.0.9". Collez ce dossier dans votre répertoire C:\Program Files (x86) \.
  • Copiez le module FindSDL2.cmake et placez-le dans un nouveau répertoire "cmake" de votre projet. J'ai trouvé un fichier FindSDL2.cmake dans la réponse mentionnée dans la réponse acceptée: https://brendanwhitfield.wordpress.com/2015/02/26/using-cmake-with-sdl2/
  • Recherchez la ligne SET(SDL2_SEARCH_PATHS dans FindSDL2.cmake et ajoutez votre répertoire de développement copié pour SDL2 en tant que nouvelle ligne: "/Program Files (x86)/SDL2-2.0.9" # Windows
  • Dans mon CMakeLists.txt, ajoutez cette ligne: set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake)

Après cela, exécuter CMake a fonctionné pour moi. J'inclus le reste de mes CMakeLists au cas où cela clarifierait tout ce que j'ai pu omettre:

cmake_minimum_required(VERSION 2.8.4)
project(Test_Project)

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

# includes cmake/FindSDL2.cmake
set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake)

set(SOURCE_FILES src/main.cpp src/test.cpp)
add_executable(test ${SOURCE_FILES})

# The two lines below have been removed to run on my Windows machine
#INCLUDE(FindPkgConfig)
#PKG_SEARCH_MODULE(SDL2 REQUIRED sdl2)
find_package(SDL2 REQUIRED)

INCLUDE_DIRECTORIES(${SDL2_INCLUDE_DIR})
TARGET_LINK_LIBRARIES(chip8 ${SDL2_LIBRARY})

J'espère que cela aidera quelqu'un dans un proche avenir. 

0

au moment de ma réponse, SDL2 est fourni avec sdl2-config exécutable (si je comprends bien, les développeurs l’appellent "expérimental") . Après "make install" de SDL2, vous pouvez l’appeler depuis un terminal sdl2-config --cflags --libs pour voir ce qu’il affiche.

Et vous pouvez ensuite ajouter un appel dans votre makefile:

set(PROJECT_NAME SomeProject)

project(${PROJECT_NAME})

execute_process(COMMAND /usr/local/bin/sdl2-config --libs RESULT_VARIABLE CMD_RES OUTPUT_VARIABLE SDL2_CFLAGS_LIBS ERROR_VARIABLE ERR_VAR OUTPUT_STRIP_TRAILING_WHITESPACE)
message("SDL2_CFLAGS_LIBS=${SDL2_CFLAGS_LIBS}; CMD_RES=${CMD_RES}; ERR_VAR=${ERR_VAR}")

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 ${SDL2_CFLAGS_LIBS}")

set(SOURCE_FILES main.cpp)
add_executable(${PROJECT_NAME} ${SOURCE_FILES})

Ici, j’ai un problème - si je mets seulement un nom d’exécutable sans chemin comme

execute_process(COMMAND sdl2-config --libs <...>

Je reçois l’erreur «Aucun fichier de ce type», c’est-à-dire que cmake ne recherche pas dans le chemin actuel et je ne sais pas comment l’écrire correctement.

Encore une remarque: dans mon makefile, je n’utilise pas l’option --cflags, car cmake trouve l’inclusion correctement et je n’ai pas besoin de les spécifier explicitement.

0
Alexo Po.
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)
0
Bibin Syamnath

J'ai eu le même problème et aucune des autres solutions ne fonctionnait .. .. Mais je l'ai finalement obtenu en suivant cette solution: Comment relier correctement les bibliothèques à cmake?

En bref, le problème était que la bibliothèque SDL2 n'était pas liée correctement dans mon CMakeLists.txt. Et en écrivant cela dans le fichier, cela a fonctionné (plus d'explications dans l'autre fil):

project (MyProgramExecBlaBla)  #not sure whether this should be the same name of the executable, but I always see that "convention"
cmake_minimum_required(VERSION 2.8)

ADD_LIBRARY(LibsModule 
    file1.cpp
    file2.cpp
)

target_link_libraries(LibsModule -lpthread)
target_link_libraries(LibsModule liblapack.a)
target_link_libraries(LibsModule -L/home/user/libs/somelibpath/)
ADD_EXECUTABLE(MyProgramExecBlaBla main.cpp)
target_link_libraries(MyProgramExecBlaBla LibsModule)
0
Antonin G.

Vous pouvez également extraire le référentiel source SDL en tant que sous-module et le construire/lier statiquement avec votre programme principal via add_subdirectory() et 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 )

(Au moins à partir de release-2.0.9 tag , peut-être plus tôt.)

0
genpfault