2015-02-08 13 views
7

Ich versuche, CLion zu verwenden, um ein SDL2-Projekt zu erstellen. Das Problem ist, dass die SDL-Header nicht gefunden werden können, wenn Sie # include's verwenden.Verwenden von SDL2 mit CMake

Meine CMakeLists.txt Datei:

cmake_minimum_required(VERSION 2.8.4) 
project(ChickenShooter) 

set(SDL2_INCLUDE_DIR C:/SDL/SDL2-2.0.3/include) 
set(SDL2_LIBRARY C:/SDL/SDL2-2.0.3/lib/x64) 

include_directories(${SDL2_INCLUDE_DIR}) 
set(SOURCE_FILES main.cpp) 

add_executable(ChickenShooter ${SOURCE_FILES}) 
target_link_libraries(ChickenShooter ${SDL2_LIBRARY}) 

Mein Test main.cpp:

#include <iostream> 
#include "SDL.h" /* This one can't be found */ 

int main(){ 
    if (SDL_Init(SDL_INIT_VIDEO) != 0){ 
     std::cout << "SDL_Init Error: " << SDL_GetError() << std::endl; 
     return 1; 
    } 
    SDL_Quit(); 
    return 0; 
} 

Vielen Dank für jede Hilfe, die Sie mir geben konnte.

Bearbeiten: Ich verwende Windows und CLion ist konfiguriert, um Cygwin64 zu verwenden.

Antwort

10

, um nicht den Pfad zu SDL2 von Hand eingestellt Sie. Verwenden Sie den richtigen Suchbefehl, der FindSDL verwendet. Sollte wie folgt aussehen:

find_file(SDL2_INCLUDE_DIR NAME SDL.h HINTS SDL2) 
find_library(SDL2_LIBRARY NAME SDL2) 
add_executable(ChickenShooter main.cpp) 
target_include_directories(ChickenShooter ${SDL2_INCLUDE_DIR}) 
target_link_libraries(ChickenShooter ${SDL2_LIBRARY})  

Wenn SDL2 nicht gefunden wird, müssen Sie den Pfad zu SDL2 zu CMAKE_PREFIX_PATH hinzuzufügen, dass der Ort ist, wo CMake für installierte Software sucht.

Wenn Sie Pkg-config verwenden können, könnte seine Verwendung leichter finden How to use SDL2 and SDL_image with cmake

Wenn Sie fühlen sich wohler ein FindSDL2.cmake Datei ähnlich zu verwenden, indem CMake bereitgestellt FindSDL.cmake finden https://brendanwhitfield.wordpress.com/2015/02/26/using-cmake-with-sdl2/

+1

Ich habe einen "Unbekannten CMake Befehl" find "'. Aber ich könnte stattdessen 'find_library (SDL)' verwenden. – charlesrockbass

+1

@charlesrockbass: Danke für den Hinweis, es sollte find_package sein. – usr1234567

+1

SDL ist nicht identisch mit SDL2, und der Standard FindSDL.cmake sucht nicht nach SDL2. – Cubic

1

Sie scheinen keinen CMake-Fehler zu haben, der Ihre Make-Datei generiert. Aber ich denke dein Problem ist, dass sich der SDL-Header in einem Unterordner namens "SDL2" befindet.

Ihre CMakeLists.txt ändern

C:/SDL/SDL2-2.0.3/include/SDL2 

Statt

C:/SDL/SDL2-2.0.3/include 
0

zum Zeitpunkt meiner Antwort, SDL2 ist mit sdl2-config ausführbare (wie ich verstehe, nennen ihn Entwickler "experimental"). Nach "make install" von SDL2 können Sie versuchen, es von Terminal mit sdl2-config --cflags --libs aufrufen, um zu sehen, was es ausgibt.

Und dann können Sie Anruf, um es in Ihrem Make-Datei hinzuzufügen:

set(PROJECT_NAME SomeProject) 

project(${PROJECT_NAME}) 

execute_process(COMMAND /usr/local/bin/sdl2-config --libs RESULT_VARIABLE CMD_RES OUTPUT_VARIABLE SDL2_CFLAGS_LIBS ERROR_VARIABLE ERR_VAR OUTPUT_STRIP_TRAILING_WHITESPACE) 
message("SDL2_CFLAGS_LIBS=${SDL2_CFLAGS_LIBS}; CMD_RES=${CMD_RES}; ERR_VAR=${ERR_VAR}") 

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 ${SDL2_CFLAGS_LIBS}") 

set(SOURCE_FILES main.cpp) 
add_executable(${PROJECT_NAME} ${SOURCE_FILES}) 

Hier habe ich ein Problem - wenn ich nur einen Namen der ausführbaren Datei ohne Pfad setzen wie

execute_process(COMMAND sdl2-config --libs <...> 

ich Fehler " Keine solche Datei ", dh cmake sucht nicht im aktuellen Pfad und ich weiß nicht, wie ich es jetzt richtig schreiben soll.

Noch ein Hinweis: In meinem Makefile benutze ich keine --cflags Option, weil cmake Finds korrekt enthält und ich sie nicht explizit angeben muss.

4

Dieser Blog-Eintrag zeigt, wie Sie es tun können: Using SDL2 with CMake

Unter Linux Sie eine aktuelle CMake (z Version 3.7) und mit SDL2 arbeitet aus der Box verwenden können.

cmake_minimum_required(VERSION 3.7) 
project(SDL2Test) 

find_package(SDL2 REQUIRED) 
include_directories(SDL2Test ${SDL2_INCLUDE_DIRS}) 

add_executable(SDL2Test Main.cpp) 
target_link_libraries(SDL2Test ${SDL2_LIBRARIES}) 

Unter Windows führen Sie das SDL2 Entwicklungspaket herunterladen, es irgendwo extrahieren und dann mit dem folgenden Inhalt eine sdl-config.cmake Datei in dem extrahierten Standort erstellen:

set(SDL2_INCLUDE_DIRS "${CMAKE_CURRENT_LIST_DIR}/include") 

# Support both 32 and 64 bit builds 
if (${CMAKE_SIZEOF_VOID_P} MATCHES 8) 
    set(SDL2_LIBRARIES "${CMAKE_CURRENT_LIST_DIR}/lib/x64/SDL2.lib;${CMAKE_CURRENT_LIST_DIR}/lib/x64/SDL2main.lib") 
else() 
    set(SDL2_LIBRARIES "${CMAKE_CURRENT_LIST_DIR}/lib/x86/SDL2.lib;${CMAKE_CURRENT_LIST_DIR}/lib/x86/SDL2main.lib") 
endif() 

string(STRIP "${SDL2_LIBRARIES}" SDL2_LIBRARIES) 

Wenn Sie jetzt konfigurieren innerhalb der CMake- GUI-Anwendung gibt es eine SDL2_DIR Variable. Sie müssen es auf das SDL2-Verzeichnis verweisen, in dem Sie das dev-Paket extrahiert und neu konfiguriert haben, dann sollte alles funktionieren.

Sie können dann SDL2-Header hinzufügen, indem Sie einfach #include "SDL.h" schreiben.