2015-02-08 20 views
7

Próbuję użyć CLion do utworzenia projektu SDL2. Problem polega na tym, że nagłówków SDL nie można znaleźć podczas używania # include.Używanie SDL2 z CMake

My CMakeLists.txt file:

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

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

Dziękuję za wszelką pomoc możesz mi dać.

Edytuj: Używam Windowsa, a CLion jest skonfigurowany do używania cygwin64.

Odpowiedz

10

Nie ustawić ścieżkę do SDL2 ręcznie. Użyj odpowiedniego polecenia find, które używa FindSDL. Powinna wyglądać następująco:

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

Jeśli SDL2 nie zostanie znaleziony, należy dodać ścieżkę do SDL2 do CMAKE_PREFIX_PATH, to miejsce, gdzie CUpewnij szuka zainstalowanego oprogramowania.

Jeśli można użyć pkg-config, jego zastosowanie może być łatwiej znaleźć How to use SDL2 and SDL_image with cmake

Jeśli czujesz się bardziej komfortowe używanie FindSDL2.cmake plik podobny do FindSDL.cmake dostarczone przez CMake patrz https://brendanwhitfield.wordpress.com/2015/02/26/using-cmake-with-sdl2/

+1

Mam polecenie 'Unknown CMake" znajdź "'. Ale mógłbym to zrobić za pomocą 'find_library (SDL)'. – charlesrockbass

+1

@charlesrockbass: Dzięki za podpowiedź, powinno to być find_package. – usr1234567

+1

SDL jest _nie_ takie samo jak SDL2, a domyślny FindSDL.cmake nie szuka SDL2. – Cubic

1

Wygląda na to, że nie ma błędu CMake, który generuje plik make. Ale myślę, że twój problem polega na tym, że nagłówek SDL znajduje się w podfolderze o nazwie "SDL2".

Zmień swoją CMakeLists.txt zawierać

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

Zamiast

C:/SDL/SDL2-2.0.3/include 
0

do czasu mojej odpowiedzi, SDL2 jest dostarczana z plikiem wykonywalnym sdl2-config (jak rozumiem, programiści nazywają go "eksperymentalnym"). Po "make install" SDL2 możesz spróbować wywołać go z terminalu z sdl2-config --cflags --libs, aby zobaczyć, co wyprowadza.

a następnie można dodać połączenie do niego w swoim makefile:

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

Tu mam problem - gdybym tylko umieścić nazwę pliku wykonywalnego bez ścieżki jak

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

otrzymuję błąd " Nie ma takiego pliku ", tzn. Cmake nie wyszukuje w aktualnej ścieżce i nie wiem jak poprawnie go zapisać.

Jeszcze jedna uwaga: w mojej makefile nie mam opcji użytkownika --cflags, ponieważ znalezienia cmake zawierają poprawnie i nie muszę ich wyraźnie określać.

4

Ten blog post pokazuje w jaki sposób można to zrobić: Using SDL2 with CMake

W systemie Linux można użyć niedawnej CMake (np wersji 3.7) i stosując SDL2 działa po wyjęciu z pudełka.

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

Pod Windows można pobrać pakiet rozwojowy SDL2, rozpakuj go gdzieś, a następnie utworzyć plik sdl-config.cmake w wysuniętym miejscu o następującej treści:

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) 

Kiedy teraz skonfigurować wewnątrz CMake- Aplikacja GUI będzie zawierała zmienną SDL2_DIR. Musisz skierować go do katalogu SDL2, w którym wyodrębniono pakiet deweloperski i ponownie skonfigurować, a następnie wszystko powinno działać.

Następnie możesz dołączyć nagłówki SDL2, pisząc #include "SDL.h".