2014-05-24 16 views
18

sto cercando il modo più semplice per compilare un programma C++ utilizzando SDL2 e SDL_image con CMake.Come utilizzare SDL2 e SDL_image con CMake

Ecco il mio miglior tentativo, dopo ore di ricerca:

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

ottengo questi errori:

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 

Ecco la chiamata di funzione:

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

Sono disperata. Mi aiuti per favore! Grazie! :)

+1

Ricordate che è una libreria SDL * * C, e non una libreria C++. Quindi usare le classi C++ come 'std :: string' come argomenti probabilmente non funzionerà. –

+0

Inoltre, dal momento che sei nuovo qui su SO, se hai una domanda riguardante errori di compilazione (linker o linker), ti preghiamo di includere il log degli errori * completo * e * non modificato nella tua domanda, incluso il codice che causa l'errore (preferibilmente un esempio [Minimo, Completo e Verificabile] (http://stackoverflow.com/help/mcve)). Nel tuo caso, per favore ** modifica la tua domanda ** per includere il codice in cui chiami 'IMG_LoadTexture' insieme con un contesto sufficiente per comprendere il codice (come le dichiarazioni delle variabili ecc.). –

+1

Non conosco le specifiche di cmake, ma non dovresti aggiungere anche '$ {SDL2_IMAGE_LIBRARIES}'? – keltar

risposta

29

Credo che il seguente funzionerà, in quanto non trova le librerie sul mio sistema Ubuntu e la funzione di esempio da Lei forniti potranno link:

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

Se cmake viene eseguito con --debug-output uscite:

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

Questo mi ha fatto controllare il contenuto del

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

ho notato che SDL2_image.pc contiene Nome: SDL2_image che presumibilmente dovrebbe corrispondere al terzo parametro a PKG_SEARCH_MODULE per questa libreria.

+0

Grazie, ha funzionato come un fascino! Dove hai trovato come fare questo? Quale riferimento? –

+0

Non ho usato alcun riferimento solo quello che ho potuto leggere dalla fonte del modulo che si utilizza e quello che so su come funzionano i file .pc .. Ho aggiornato la risposta con informazioni aggiuntive. :) – wojciii

+0

Grazie per la modifica! Ma come ti ha aiutato '--debug-output'? Sto solo cercando di capire come hai funzionato. –

2

ci sono due post del blog su questo qui:

Using SDL2 with CMake

Using SDL2_image with CMake

Fondamentalmente è necessario un modulo FindSDL2.cmake e FindSDL2_image.cmake. Possono essere basati su quelli che funzionano per SDL 1.2 che sono già inclusi in CMake. L'utilizzo di questi moduli Trova funzionerà anche su Windows.

Se siete su Linux e solo bisogno SDL2 non è nemmeno necessario il FindSDL2.cmake come le seguenti opere già:

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