c++ cmake sdl sdl-2 sdl-image

c++ - Cómo usar SDL2 y SDL_image con cmake



sdl-2 sdl-image (3)

Creo que lo siguiente funcionará, ya que encuentra las bibliotecas en mi sistema ubuntu y la función de ejemplo que proporcionó se puede vincular:

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 se ejecuta con --debug-output, genera:

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

Esto me hizo comprobar el contenido de

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

Noté que SDL2_image.pc contiene Nombre: SDL2_image que asumí debería coincidir con el tercer parámetro a PKG_SEARCH_MODULE para esta biblioteca.

Estoy buscando la forma más sencilla de compilar un programa en c ++ usando SDL2 y SDL_image con cmake.

Aquí está mi mejor intento, después de horas de búsqueda:

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

Me sale estos errores:

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

Aquí está la llamada a la función:

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

Estoy desesperado. ¡Por favor, ayúdame! ¡Gracias! :)


Estaba teniendo problemas con estas respuestas, creo que cmake cambió la forma de importar objetivos. Siguiendo la publicación del blog de @trenki, necesitaba cambiar mi CMakeLists.txt a:

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

Actualmente esto funciona fuera de la caja en Arch Linux.


Hay dos publicaciones de blog sobre esto aquí:

Usando SDL2 con CMake

Usando SDL2_image con CMake

Básicamente necesitas un módulo FindSDL2.cmake y FindSDL2_image.cmake . Pueden basarse en las que funcionan para SDL 1.2 que ya están incluidas en CMake. El uso de estos módulos Buscar también funcionará en Windows.

Si está en Linux y solo necesita SDL2, ni siquiera necesita FindSDL2.cmake ya que lo siguiente ya funciona:

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