it-swarm.com.de

Verwenden von SDL2 mit CMake

Ich versuche, CLion zu verwenden, um ein SDL2-Projekt zu erstellen ... Das Problem ist, dass die SDL-Header bei Verwendung von # include nicht gefunden werden können.

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 könnten.

Bearbeiten: Ich verwende Windows und CLion ist für die Verwendung von cygwin64 konfiguriert.

15
Ovenkoek

Legen Sie den Pfad nicht von Hand auf SDL2 fest. Verwenden Sie den richtigen Suchbefehl, der FindSDL verwendet. Sollte aussehen, wie:

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 hinzufügen. Dort sucht CMake nach installierter Software.

Wenn Sie Pkg-config verwenden können, ist die Verwendung möglicherweise einfacher. Weitere Informationen finden Sie unter So verwenden Sie SDL2 und SDL_image mit cmake .

Wenn Sie sich mit der Verwendung einer FindSDL2.cmake-Datei, die der von CMake bereitgestellten FindSDL.cmake-Datei ähnelt, wohler fühlen, finden Sie weitere Informationen unter https://brendanwhitfield.wordpress.com/2015/02/26/using-cmake-with-sdl2/ .

16
usr1234567

Dieser Blogbeitrag zeigt, wie Sie dies tun können: SDL2 mit CMake verwenden

Unter Linux können Sie eine aktuelle Version von CMake (z. B. Version 3.7) verwenden, und SDL2 ist sofort einsatzbereit.

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 können Sie das SDL2-Entwicklungspaket herunterladen, es irgendwo extrahieren und dann am entpackten Speicherort eine sdl-config.cmake-Datei mit folgendem Inhalt 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 nun die CMake-GUI-Anwendung konfigurieren, wird eine SDL2_DIR-Variable angezeigt. Sie müssen auf das SDL2-Verzeichnis zeigen, in das Sie das dev-Paket extrahiert haben, und dann neu konfigurieren. Dann sollte alles funktionieren.

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

10
trenki

Es scheint, dass Sie keinen CMake-Fehler haben, während Sie Ihre Make-Datei erstellen. Aber ich denke, Ihr Problem ist, dass sich der SDL-Header in einem Unterordner namens "SDL2" befindet.

Ändern Sie Ihre CMakeLists.txt, um sie aufzunehmen

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

Anstatt

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

Mit dem von mir entwickelten Modul SDL2 CMake können Sie die SDL2-Bibliothek problemlos in einen modernen und tragbaren Ansatz integrieren.

Sie sollten das Modul einfach in cmake/sdl2 (oder nur das Modul-Repo klonen) in Ihrem Projekt kopieren:

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

Fügen Sie dann die folgenden Zeilen in Ihre CMakeLists.txt ein:

list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake/sdl2)
find_package(SDL2 REQUIRED)
target_link_libraries(${PROJECT_NAME} SDL2::Main)

Hinweis: Wenn CMake die SDL2-Bibliothek (in Windows) nicht gefunden hat, können Sie die CMake-Option SDL2_PATH wie folgt angeben:

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

Weitere Informationen finden Sie in der Datei README.md .

Die SDL2 CMake-Module unterstützen andere verwandte Bibliotheken: SDL2_image, SDL2_ttf, SDL2_mixer, SDL2_net und SDL2_gfx.

Eine Liste von Beispielen/Beispielen und Projekten, die diese Module verwenden, finden Sie hier: https://github.com/aminosbh/sdl-samples-and-projects

1
aminosbh

Mit der kompilierten Version von SDL2-2.0.9 mit MinGW-w64 unter Windows funktioniert die folgende Konfiguration für mich:

find_package(SDL2 REQUIRED)

add_executable(sdl-test ${SOURCES})

target_link_libraries(sdl-test
  mingw32
  SDL2::SDL2main
  SDL2::SDL2
)

Eine längere Erklärung

Beim Lesen der Datei SDL2Targets.cmake Habe ich erfahren, dass SDL2 mehrere Ziele bietet:

  • SDL2::SDL2main (lib/libSDL2main.a)
  • SDL2::SDL2 (lib/libSDL2.dll.a)
  • SDL2::SDL2-static (lib/libSDL2-static.a)

Jeder von ihnen hat INTERFACE_INCLUDE_DIRECTORIES Definiert, was bedeutet, dass wir für SDL2 nicht manuell include_directories Angeben müssen.

Es reicht jedoch nicht aus, nur SDL2::SDL2main Und SDL2::SDL2 Als target_link_libraries Hinzuzufügen. Der G ++ - Compiler beschwert sich möglicherweise über einen "undefinierten Verweis auf WinMain".

Bei der Überprüfung der Compileroptionen wurde festgestellt, dass die SDL2-Bibliotheken vor der Option -lmingw32 Hinzugefügt werden. Damit die Option -lmingw32 Vor den SDL2-Bibliotheken angezeigt wird, müssen Sie auch mingw32 Als erstes target_link_libraries Angeben. Damit funktioniert diese Konfiguration.

Der Befehl, mit dem ich es erstellt habe, lautet:

$ mkdir build && cd build && cmake .. -G"MinGW Makefiles" && cmake --build .

Das einzige kleine Problem hierbei sind die endgültig generierten Compileroptionen, die Option -lmingw32 Ist dupliziert. Aber da es den Verknüpfungsprozess nicht beeinflusst, habe ich es vorerst ignoriert.

1
xiGUAwanOU

Hervorheben der Schritte, wie ich dies mit dem Modul FindSDL2.cmake erreichen konnte:

  • Laden Sie SDL2-devel-2.0.9-VC.Zip (oder welche Version nach Veröffentlichung dieser Antwort veröffentlicht wird) im Abschnitt Development Libraries der Downloadseite herunter.
  • Extrahieren Sie den Zip-Ordner, und es sollte ein Ordner ähnlich "SDL2-2.0.9" angezeigt werden. Fügen Sie diesen Ordner in Ihr Verzeichnis C:\Program Files (x86)\ein.
  • Kopieren Sie das Modul FindSDL2.cmake und platzieren Sie es in einem neuen "cmake" -Verzeichnis in Ihrem Projekt. Ich habe eine FindSDL2.cmake-Datei in der Antwort gefunden, auf die in der akzeptierten Antwort verwiesen wird: https://brendanwhitfield.wordpress.com/2015/02/26/using-cmake-with-sdl2/
  • Suchen Sie die Zeile SET(SDL2_SEARCH_PATHS in FindSDL2.cmake und fügen Sie Ihr kopiertes Entwicklungsverzeichnis für SDL2 als neue Zeile hinzu: "/Program Files (x86)/SDL2-2.0.9" # Windows
  • Fügen Sie in meiner CMakeLists.txt folgende Zeile hinzu: set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake)

Danach funktionierte CMake für mich. Ich füge den Rest meiner CMakeLists hinzu, nur für den Fall, dass alles geklärt wird, was ich ausgelassen habe:

cmake_minimum_required(VERSION 2.8.4)
project(Test_Project)

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

# includes cmake/FindSDL2.cmake
set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake)

set(SOURCE_FILES src/main.cpp src/test.cpp)
add_executable(test ${SOURCE_FILES})

# The two lines below have been removed to run on my Windows machine
#INCLUDE(FindPkgConfig)
#PKG_SEARCH_MODULE(SDL2 REQUIRED sdl2)
find_package(SDL2 REQUIRED)

INCLUDE_DIRECTORIES(${SDL2_INCLUDE_DIR})
TARGET_LINK_LIBRARIES(chip8 ${SDL2_LIBRARY})

Hoffe, das hilft jemandem in naher Zukunft. 

zum Zeitpunkt meiner Antwort ist SDL2 mit sdl2-config ausführbar (so wie ich es verstehe, nennen ihn Entwickler "experimentell") . Nach "make install" von SDL2 können Sie versuchen, es vom Terminal aus mit aufzurufen sdl2-config --cflags --libs, um zu sehen, was ausgegeben wird.

Und dann können Sie den Aufruf in Ihrem Makefile hinzufü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 ausführbaren Namen ohne Pfad lege

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

Ich erhalte die Fehlermeldung "Keine solche Datei", d.h.

Noch eine Bemerkung: In meinem Makefile benutze ich keine --cflags-Option, da cmake die Include-Einträge korrekt findet und ich sie nicht explizit angeben muss.

0
Alexo Po.
cmake_minimum_required(VERSION 2.8.4)

project(ChickenShooter)

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

include_directories(${SDL2_INCLUDE_DIR})
link_directories(${SDL2_LIB_DIR})

set(SOURCE_FILES main.cpp)

add_executable(${PROJECT_NAME} ${SOURCE_FILES})
target_link_libraries(${PROJECT_NAME} SDL2main SDL2)
0
Bibin Syamnath

Ich hatte das gleiche Problem und keine der anderen Lösungen funktionierte ... __ Aber ich habe es schließlich mit dieser Lösung zum Laufen gebracht: Wie kann ich Bibliotheken korrekt mit cmake verknüpfen?

Kurz gesagt, das Problem war, dass die SDL2-Bibliothek in meiner CMakeLists.txt nicht richtig verlinkt wurde. Und durch das Schreiben in die Datei funktionierte es (weitere Erklärungen im anderen Thread):

project (MyProgramExecBlaBla)  #not sure whether this should be the same name of the executable, but I always see that "convention"
cmake_minimum_required(VERSION 2.8)

ADD_LIBRARY(LibsModule 
    file1.cpp
    file2.cpp
)

target_link_libraries(LibsModule -lpthread)
target_link_libraries(LibsModule liblapack.a)
target_link_libraries(LibsModule -L/home/user/libs/somelibpath/)
ADD_EXECUTABLE(MyProgramExecBlaBla main.cpp)
target_link_libraries(MyProgramExecBlaBla LibsModule)
0
Antonin G.

Sie können das SDL-Quell-Repository auch als Submodul abrufen und statisch zusammen mit Ihrem Hauptprogramm über add_subdirectory() und target_link_libraries() erstellen/verknüpfen:

cmake_minimum_required( VERSION 3.7.0 )
project( sdl2-demo )

set( SDL_STATIC ON CACHE BOOL "" FORCE )
set( SDL_SHARED OFF CACHE BOOL "" FORCE )
add_subdirectory( external/sdl )

add_executable(
    sdl2-demo
    "src/main.cpp"
    )
target_link_libraries( sdl2-demo SDL2main SDL2-static )

(Zumindest ab dem release-2.0.9-Tag möglicherweise früher.)

0
genpfault