web-dev-qa-db-ja.com

cmakeでSDL2およびSDL_imageを使用する方法

SDL2SDL_imageをcmakeで使用して、C++プログラムをコンパイルする最も簡単な方法を探しています。

これは、何時間もの検索の後の私の最善の試みです。

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

私は必死です。私を助けてください!ありがとう! :)

24
Carl Lemaire

私の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にはName:SDL2_imageが含まれており、このライブラリの3番目のパラメーターをPKG_SEARCH_MODULEに一致させる必要があると思いました。

37
wojciii

これに関する2つのブログ投稿があります。

CMakeでSDL2を使用

CMakeでSDL2_imageを使用

基本的に、FindSDL2.cmakeおよびFindSDL2_image.cmakeモジュールが必要です。 CMakeに既に含まれているSDL 1.2で動作するものをベースにすることができます。これらの検索モジュールを使用すると、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})
6
trenki

これらの回答に問題がありました。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でそのまま使用できます。

4
Charles

SDL2、SDL2_imageにリンクするための現代的でポータブルなアプローチを導入しました。これらの SDL2 CMakeモジュール では、次のようにSDL2&SDL2_imageプロジェクトをビルドできます。

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)

プロジェクトのリポジトリを複製するだけです:

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

注:CMakeがSDL2/SDL2_imageライブラリを見つけられなかった場合(Windowsの場合)、CMakeオプションを指定できますSDL2_PATHおよびSDL2_IMAGE_PATH 次のように:

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

他の関連ライブラリもサポートしています:SDL2_ttf、SDL2_net、SDL2_mixer、SDL2_gfx。詳細については、 README.md ファイルをご覧ください。

これらのモジュールを使用するサンプル/サンプルおよびプロジェクトのリストは、ここにあります: https://github.com/aminosbh/sdl-samples-and-projects

0
aminosbh

次のコマンドは私にとってはうまく機能します:

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

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