2014-05-24 10 views
18

ich bin für die einfachste Weg, um eine C++ Programm mit SDL2 und SDL_image mit cmake zu kompilieren.So verwenden SDL2 und SDL_image mit cmake

Hier ist mein bester Versuch, nach Stunden des Suchens:

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

ich diese Fehler:

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 

Hier ist der Funktionsaufruf:

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

Ich bin verzweifelt. Bitte hilf mir! Danke! :)

+1

Denken Sie daran, dass SDL a * C * Bibliothek ist, und nicht eine C++ Bibliothek. C++ - Klassen wie 'std :: string' als Argumente zu verwenden, wird höchstwahrscheinlich nicht funktionieren. –

+0

Da Sie neu hier auf SO sind, wenn Sie eine Frage bezüglich Build (Compiler oder Linker) -Fehler haben, fügen Sie bitte das Fehlerprotokoll * complete * und * unedited * in Ihre Frage ein, einschließlich des Codes, der den Fehler verursacht (vorzugsweise ein [minimales, vollständiges und überprüfbares Beispiel] (http://stackoverflow.com/help/mcve)). In Ihrem Fall bearbeiten Sie bitte ** Ihre Frage ** und fügen Sie den Code, den Sie 'IMG_LoadTexture' nennen, zusammen mit genügend Kontext ein, um den Code zu verstehen (wie Variablendeklarationen etc.). –

+1

Kennen Sie keine cmake-Details, aber sollten Sie '$ {SDL2_IMAGE_LIBRARIES}' auch nicht hinzufügen? – keltar

Antwort

29

Ich denke, dass die folgenden funktionieren wird, wie es die Bibliotheken auf meinem Ubuntu-System findet und die Beispielfunktion Leistungen Sie können 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}) 

Wenn cmake mit debug-Ausgabe ausgeführt es Ausgänge:

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

Das machte mir den Inhalt

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

prüfe ich bemerkt, dass SDL2_image.pc enthält Name: SDL2_image , die ich vermutete sollte der dritte Parameter zu PKG_SEARCH_MODULE für diese Bibliothek übereinstimmen.

+0

Danke, das hat wie ein Zauber funktioniert! Wo hast du das gefunden? Welche Referenz? –

+0

Ich habe keine Referenz verwendet, was ich aus der Quelle des verwendeten Moduls lesen konnte und was ich darüber weiß, wie .pc-Dateien funktionieren. Ich aktualisierte die Antwort mit zusätzlichen Informationen. :) – wojciii

+0

Danke für die Bearbeitung! Aber wie hat Ihnen "--debug-output" geholfen? Ich versuche nur zu verstehen, wie du es herausgefunden hast. –

2

Es gibt zwei Blog-Posts über diese hier:

Using SDL2 with CMake

Using SDL2_image with CMake

Grundsätzlich benötigen Sie einen FindSDL2.cmake und FindSDL2_image.cmake Modul. Sie können auf denen basieren, die für SDL 1.2 funktionieren und bereits in CMake enthalten sind. Die Verwendung dieser Suchmodule funktioniert auch unter Windows.

Wenn Sie auf Linux sind und nur brauchen SDL2 Sie brauchen nicht einmal die FindSDL2.cmake wie die folgenden, bereits funktioniert:

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