Как использовать SDL2 и SDL_image с cmake

Я ищу самый простой способ для компиляции программы на C ++ с использованием SDL2 а также SDL_image с помощью cmake.

Вот моя лучшая попытка после нескольких часов поиска:

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

Я получаю эти ошибки:

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

Вот вызов функции:

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

Я в отчаянии. Пожалуйста, помогите мне!
Спасибо! 🙂

20

Решение

Я думаю, что сработает следующее, так как он найдет библиотеки в моей системе Ubuntu и приведенную вами примерную функцию может связать:

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

Если cmake выполняется с параметром —debug-output, он выдает:

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

Это заставило меня проверить содержимое

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

Я заметил, что SDL2_image.pc содержит
Имя: SDL2_image
который я предположил, должен соответствовать третий параметр PKG_SEARCH_MODULE для этой библиотеки.

31

Другие решения

Об этом есть два сообщения в блоге:

Использование SDL2 с CMake

Использование SDL2_image с CMake

В основном вам нужно FindSDL2.cmake а также FindSDL2_image.cmake модуль. Они могут быть основаны на тех, которые работают для SDL 1.2, которые уже включены в CMake. Использование этих модулей поиска также будет работать в Windows.

Если вы используете Linux и вам нужен только SDL2, вам даже не нужен FindSDL2.cmake как уже работает следующее:

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

У меня были проблемы с этими ответами, я думаю, что cmake изменил способ импорта целей. После публикации в блоге @trenki мне нужно было изменить свой CMakeLists.txt на:

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

В настоящее время это работает из коробки на Arch Linux.

1
По вопросам рекламы [email protected]