2015-10-14 27 views
5

Podążam za kilkoma tutorialami z reddit.com/r/limeoats, aby nauczyć się programowania gier w języku C++. Nie mam doświadczenia z CMake ani CLion i udało mi się dotrzeć do tego tak daleko.Używanie SDL2 z SDL2_image na OS X 10.11 (CMake 3.3 w CLION 1.1)

Miałem wszystko, co pracowałem, dopóki nie zaktualizowałem OSX do El Capitan (10.11). Wygląda na to, że nie mogę już używać #include "SDL2/SDL.h", ale zamiast tego trzeba użyć #include "SDL.h" Następnie można znaleźć nagłówki SDL. Problem pojawia się, kiedy również użyć #include "SDL_image.h" pojawia się następujący błąd kompilatora:

/Library/Frameworks/SDL2_image.framework/Headers/SDL_image.h:27:10: 
fatal error: 'SDL2/SDL.h' file not found 
#include <SDL2/SDL.h> 
     ^

Patrząc w pliku nagłówka w moim folderze szkieletowe ma #include <SDL2/SDL.h> ale CUpewnij jest dostarczanie go jako SDL.h z jakiegoś powodu po uaktualnieniu OSX do 10.11.

Jak uzyskać ładowanie rozszerzeń SDL z zaktualizowaną ścieżką nagłówka? Lub w jaki sposób mogę uzyskać CMake, aby przywrócić mi wsteczną ścieżkę nagłówka SDL2/SDL.h?

Poniżej znajduje się mój CMakeLists.txt i mam FindSDL2.cmake (proszę zauważyć komentarz do linii 50) i FindSDL2_image.cmake z here.

cmake_minimum_required(VERSION 3.3) 
project(Cavestory) 

set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${PROJECT_SOURCE_DIR}/cmake") 

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") 
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/bin) 

include_directories(${PROJECT_SOURCE_DIR}/source/headers) 

find_package(SDL2 REQUIRED) 
find_package(SDL2_image REQUIRED >=2.0.0) 

include_directories(${SDL2_INCLUDE_DIR}) 
include_directories(${SDL2_IMAGE_INCLUDE_DIR}) 

file(GLOB SOURCE_FILES "source/src/*.cpp") 

add_executable(Cavestory ${SOURCE_FILES}) 

# One thread said this is all I should need to link SDL2 
# but cannot get this to work at all 
#target_link_libraries(Cavestory SDL2 SDL2_image) 

#add_custom_command(TARGET Cavestory POST_BUILD 
#  COMMAND ${CMAKE_COMMAND} -E copy_directory 
#  ${CMAKE_SOURCE_DIR}/content $<TARGET_FILE_DIR:Cavestory>) 

A moja struktura katalogów (czy to pomaga) ...

/Cavestory (root) 
    CMakeLists.txt 
    /bin 
    /cmake 
     FindSDL2.cmake 
     FindSDL2_image.cmake 
    /content 
     /sprites 
      **images** 
    /docs 
    /source 
     /headers 
      **header files** 
     /src 
      **code files** 
+0

Spróbuj usunąć katalogi_zapasowań ($ {SDL2_INCLUDE_DIR}) include_directories ($ {SDL2_IMAGE_INCLUDE_DIR}), ponieważ jest zbędny. find_package zrobi to za Ciebie. – MinaKamel

+0

Na marginesie powinieneś dołączyć 'SDL.h', a nie' SDL/SDL.h'. [Źródło] (https://wiki.libsdl.org/FAQDevelopment#Do_I_.23include_.3CSDL.h.3E_or_.3CSDL.2FSDL.h.3E.3F). – emlai

+0

@MinaKamel - Usunięto te linie, kompilator nie może znaleźć pliku sdl.h ani SDL2/sdl.h - w oparciu o to, co przeczytałem FindSDL.cmake ustawia te zmienne, ale nie wywołuje z nimi include_directories. – Rob

Odpowiedz

2

czuję głupi ... Mój plik CMakeLists.txt jest poprawne z wyjątkiem Musiałem dodać następujące

target_link_libraries(Cavestory ${SDL2_LIBRARY} ${SDL2_IMAGE_LIBRARY}) 

zamiast

target_link_libraries(Cavestory SDL2 SDL2_image) 

Naprawia problem z łączem SDL z SDL_image.h; Jednak po aktualizacji do El Capitan, nie mogę już odwoływać się do SDL przez #include "SDL2/SDL.h" i muszę użyć #include "SDL.h" - podczas gdy jest to preferowane, chciałbym wiedzieć, dlaczego/jak zmieniło się to pomiędzy OSX 10.10 i OS X 10.11.

+0

Zmiana 'target_link_libraries' nie może mieć wpływu na katalogi include (połączenie przychodzi * po * kompilowaniu źródeł). Prawdopodobnie problem był w czymś innym. W każdym razie dobrze, że go rozwiązałeś. – Tsyvarev

+0

@Rob Czy jest jeszcze coś, co wypróbowałeś poza tym wątkiem? Widziałem to samo zachowanie po aktualizacji do El Capitan i śledzenie tego wątku bez powodzenia. – JoshBramlett

+0

Ja nie. Załączam SDL w moim kodzie za pomocą '#include" SDL.h "' zamiast '#include" SDL/SDL.h "' nie wiem dlaczego zmieniło się między wersjami OSX, co jest dla mnie dziwne. – Rob